我知道之前已经提出了类似的问题,但这些问题的解决方案对我不起作用。情况是我有一个对象数组,每个对象都被发送到asynctask上传到服务器。我需要单独发送每个对象,但列表中的每个对象使用相同的asynctask,因此在onPostExecute()中调用task.execute不是一个选项,因为这会导致它无限地调用自身。我尝试了类似的东西
for(each item in list){
task.execute();
while(task.getStatus() != android.os.AsyncTask.Status.FINISHED){
//spin here and wait
}
}
但是当这样做时它只是永远旋转而永远不会离开while循环。 任何建议都非常感谢
答案 0 :(得分:6)
来自AsyncTask docs:
从HONEYCOMB开始,任务在单个线程上执行,以避免因并行执行而导致的常见应用程序错误。
所以如果你不是> = HONEYCOMB,那么可能会切换到使用ExecutorService:
ExecutorService executor = Executors.newSingleThreadExecutor();
答案 1 :(得分:3)
为什么不更改您的架构:上传异步任务需要上传一系列文件并循环播放它们?
如果您真的希望保持这种状态,只需使用lock
对象即可
类似的东西:
class MyAsyncClass extends AsyncTask{
static Object lock = new Object();
.......
void doWork(){
synchronized(lock) {
//do stuff
}
}
}
编辑:我应该指出,不确保您按顺序执行doWork()
方法,并调用它们。
答案 2 :(得分:1)
我建议您切换到Thread并Executor service来执行此操作。这将使您更好地掌握顺序执行和并行执行任务之间的切换。
在ExecutorService(实际上是一个Threadpool管理器)的帮助下。
示例:
ExecutorService service = Executors.newFixedThreadPool(1);
service.submit(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
});
您可以向此提交尽可能多的runnable,并且由于线程数为1,它将按顺序执行。
要与UI通信,您可以使用Handler。
答案 3 :(得分:0)
public void onPostExecute(){if(blahblah){
task.execute();
}
}
AKA在task.execute上放置了一条if语句,因此你可以控制..
答案 4 :(得分:0)
你可以考虑使用IntentService而不是AsyncTask
- 因为启动多个意图到同一个IntentService
会排队操作,所以之前启动的Intent会有在第二个onHandleIntent(Intent)
运行之前完成。