android异步任务的同步策略

时间:2014-06-30 17:25:38

标签: java android multithreading concurrency synchronized

我正在尝试在android中实现一个简单的同步策略。

一个服务实例化A类,并在循环的每次迭代中调用它的方法sendToServer()。这会导致启动多个异步任务,并且服务立即结束。该服务可以随时再次运行并重复该过程。

因此,为防止两个异步任务采用相同的输入,我将Ids存储在同步列表中,并在启动异步任务之前检查列表。

但我很困惑我需要在synchronized块中放入哪一段代码?我将整个方法isAlreadyRunning()定义为synchronized吗?或者我根本不需要定义任何同步的代码块?

这是我的班级:

public class A{
    private static List<Integer> idList = Collections.synchronizedList(new ArrayList<Integer>());

    private boolean isAlreadyRunning(id){
        //iterate through the list and return true if the id is already present
        ....
        }

    private class sendToServerAsyncTask extends AsyncTask<Void, Void, Boolean>{
        @Override
        protected Boolean doInBackground(Void... params) {
            //send http request 
            }

        @Override
        protected void onPostExecute(Boolean result){
            idList.remove(id);
            }
        }

    public void sendToServer(int id) {
        if(isAlreadyRunning(id)){
            // an async task is already running for this id.
            //,so dont start the async task again, just exit
            return; 
        else {
            idList.add(id);
            new sendToServerAsyncTask(id).execute();
            }


        }
    }

1 个答案:

答案 0 :(得分:2)

根据Android的文档

ASYNC任务的执行顺序

首次引入时,AsyncTasks在一个后台线程上连续执行。从DONUT开始,这被更改为一个线程池,允许多个任务并行运行。从HONEYCOMB开始,任务在单个线程上执行,以避免由并行执行引起的常见应用程序错误。

Asynctask的实例已经放置在由框架维护的队列中,并且它们是按顺序执行的,即只有在一个任务完成后另一个任务才会启动,因此并行执行不会出现问题,因为它没有& #39; t存在。

所以你不需要做任何事情,框架会为你处理它。