同步处理资料任务的Android
问题描述:
在我的应用程序有多个地方的AsyncTask可以调用连接到网络,下载的东西,等它可以从活动或后台服务。同步处理资料任务的Android
有各种问题,因为我在读取和写入SQLite数据库并在多个任务上的类似操作重叠(假设GetMail在后台运行,用户手动启动它)。
我想syncronize类型的这一任务,并写了这样的代码。我不知道如何测试它,它似乎是正常运行,但我希望得到你的意见,如果它是有效的。这里
public enum AsyncTasks
{
GetMail,
PostMail,
}
public class MyApplication extends Application
{
private final ArrayList<AsyncTasks> mLockedAsyncTasks = new ArrayList<AsyncTasks>();
public boolean lockAsyncTask(AsyncTasks task)
{
synchronized (mLockedAsyncTasks)
{
if (!mLockedAsyncTasks.contains(task))
{
mLockedAsyncTasks.add(task);
return true;
}
return false;
}
}
public void unlockAsyncTask(AsyncTasks task)
{
synchronized (mLockedAsyncTasks)
{
if (mLockedAsyncTasks.contains(task))
{
mLockedAsyncTasks.remove(task);
}
}
}
}
的想法是,我打电话lockAsyncTask
如果成功 - 我开始与HTTP的东西,否则跳过,因为它已经运行。
答
可能更容易只使用由单一工作线程支持的操作队列。这样所有任务将按照他们收到的顺序运行。您可以通过使用Executors
工厂方法轻松完成此操作。这里有一个简单的例子:
private static final ExecutorService mThreadPool =
Executors.newSingleThreadExecutor();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mThreadPool.execute(new Runnable() {
public void run() {
// Do some work here...
}
});
mThreadPool.execute(new Runnable() {
public void run() {
// Do some additional work here after
// the first Runnable has finished...
}
});
}