Android 具有顺序执行的多个异步任务
我知道以前也有人问过类似的问题,但这些问题的解决方案对我来说是行不通的。情况是,我有一个对象数组,每个对象都通过异步任务被发送到并上传到服务器。我需要分别发送每个对象,但列表中的每个对象都使用相同的asynctask,因此在onPostExecute()中调用task.execute不是一个选项,因为这会导致它无限地调用自身。我试过这样的方法Android 具有顺序执行的多个异步任务,android,android-asynctask,Android,Android Asynctask,我知道以前也有人问过类似的问题,但这些问题的解决方案对我来说是行不通的。情况是,我有一个对象数组,每个对象都通过异步任务被发送到并上传到服务器。我需要分别发送每个对象,但列表中的每个对象都使用相同的asynctask,因此在onPostExecute()中调用task.execute不是一个选项,因为这会导致它无限地调用自身。我试过这样的方法 for(each item in list){ task.execute(); while(task.getStatus() != and
for(each item in list){
task.execute();
while(task.getStatus() != android.os.AsyncTask.Status.FINISHED){
//spin here and wait
}
}
但这样做时,它只会永远旋转,永远不会离开while循环。
非常感谢您提出的任何建议为什么不改变您的体系结构:让上传异步任务上传一系列文件,然后循环执行 如果您真的想保持这种状态,只需使用
锁
对象。比如:
class MyAsyncClass extends AsyncTask{
static Object lock = new Object();
.......
void doWork(){
synchronized(lock) {
//do stuff
}
}
}
EDIT:我应该指出,这并不能确保doWork()
方法按照调用顺序执行。来自AsyncTask文档:
从蜂巢开始,任务在单个线程上执行,以避免并行执行导致的常见应用程序错误
因此,如果您不是>=蜂巢,那么可能会切换到使用ExecutorService:
ExecutorService executor = Executors.newSingleThreadExecutor();
AKA在task.execute上放置一个if语句,这样您就可以控制了。您可以考虑使用异步任务,而不是
异步任务--
将运行。我建议您切换到线程并执行此操作。这将使您能够更好地控制任务的顺序和并行执行之间的切换
在ExecutorService(实际上是线程池管理器)的帮助下
- 您可以将任务作为runnable传递给executor服务
- 您可以定义executor服务要使用的线程数(对于您的情况,将其设为1)
ExecutorService service = Executors.newFixedThreadPool(1);
service.submit(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
});
您可以将尽可能多的Runnable提交给此线程,因为线程数为1,所以它将按顺序执行
为了与UI进行通信,您可以使用用户处理程序。因此,如果我大于蜂巢,调用时会发生什么情况。task.execute();task.execute();它将以串行方式执行,同样来自docs for API>=11:串行执行器是默认值:
以串行顺序一次执行一个任务的执行器。此序列化是特定进程的全局序列化是的,我真希望我知道这一点。我只是假设,由于异步任务启动了一个新线程,因此每个新调用也会创建一个新线程
将不起任何作用,它将充当对象,您可以锁定它。哦,好的,然后在onPostexecute()中解锁它?您是否有可能提供一些简短的sudo代码来说明这是如何实现的work@KBusc当然可以,看一看
ExecutorService service = Executors.newFixedThreadPool(1);
service.submit(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
});