0

在我的应用程序中,我有多个地方可以调用 AsyncTask 以连接到 Web、下载内容等。它可以来自 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 的东西,否则跳过,因为它已经在运行。

4

1 回答 1

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...
        }
    });
}
于 2012-07-26T19:25:48.947 回答