在我的应用程序中,我有多个地方可以调用AsyncTask来连接到网页,下载内容等。它可以来自Activity或后台服务。
存在各种问题,因为我正在读写SQLite数据库,并且当多个任务在类似操作上重叠时(假设GetMail在后台运行并且用户手动启动它)。
我想同步这个任务的类型并编写这样的代码。我不确定如何测试它,似乎运行正常,但我想得到你的意见,如果它是有效的..
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内容,否则跳过它已经运行了。
答案 0 :(得分:1)
使用由单个工作线程支持的操作队列可能更容易。这样,所有任务都将按照收到的顺序运行。您可以使用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...
}
});
}