在Android中同步任务

时间:2012-07-26 18:12:50

标签: java android asynchronous

在我的应用程序中,我有多个地方可以调用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内容,否则跳过它已经运行了。

1 个答案:

答案 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...
        }
    });
}