我正在尝试在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();
}
}
}
答案 0 :(得分:2)
根据Android的文档
ASYNC任务的执行顺序
首次引入时,AsyncTasks
在一个后台线程上连续执行。从DONUT
开始,这被更改为一个线程池,允许多个任务并行运行。从HONEYCOMB
开始,任务在单个线程上执行,以避免由并行执行引起的常见应用程序错误。
Asynctask
的实例已经放置在由框架维护的队列中,并且它们是按顺序执行的,即只有在一个任务完成后另一个任务才会启动,因此并行执行不会出现问题,因为它没有& #39; t存在。
所以你不需要做任何事情,框架会为你处理它。