Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 具有顺序执行的多个异步任务_Android_Android Asynctask - Fatal编程技术网

Android 具有顺序执行的多个异步任务

Android 具有顺序执行的多个异步任务,android,android-asynctask,Android,Android Asynctask,我知道以前也有人问过类似的问题,但这些问题的解决方案对我来说是行不通的。情况是,我有一个对象数组,每个对象都通过异步任务被发送到并上传到服务器。我需要分别发送每个对象,但列表中的每个对象都使用相同的asynctask,因此在onPostExecute()中调用task.execute不是一个选项,因为这会导致它无限地调用自身。我试过这样的方法 for(each item in list){ task.execute(); while(task.getStatus() != and

我知道以前也有人问过类似的问题,但这些问题的解决方案对我来说是行不通的。情况是,我有一个对象数组,每个对象都通过异步任务被发送到并上传到服务器。我需要分别发送每个对象,但列表中的每个对象都使用相同的asynctask,因此在onPostExecute()中调用task.execute不是一个选项,因为这会导致它无限地调用自身。我试过这样的方法

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

        }
    });