7

我已经实现了 2 个异步任务,我使用的是 android4.0。其中一个异步任务是连续执行的,第二个是根据要求执行的(可能是多次)。例如。

class AsynTask1 exetends AsyncTask<Void, Bitmap, Void>{
    protected Void doInBackground(Void... params) {
        while(true){
            publishProgress(bmp);
        }
    }
}

class AsynTask2 extends AsyncTask<String, Void,Void>{
    protected Void doInBackground(String... params){
        System.out.println(params[0])
    }
}

在活动课

class MainActivity extends Activity{
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        new AsynTask1().execute();

        int i=0;
        while(i<100)
        {
            if(i%2==0)
            new AsynTask2().execute("no is even"+i);
            i++
        }
    }
}     

在上述情况下,不执行 AsynTask2。

如果尝试使用 executeOnExecutor(AsyncTask.THREAD_POOL_Executor,params),那么两个 asyntask 都被执行并且我从 AsynTask2 获取打印消息,但这些消息不按顺序排列(如 0 2 6 4 10 8 12 14 ....)。

有什么方法可以连续执行 AsynTask1 并按顺序执行 AsynTask2 以防止顺序(如 0 2 4 6 8 10 12 14 ....)。

谢谢和问候迷你。

4

4 回答 4

5

SERIAL_EXECUTOR用于 Asynctask2

 new AsynTask2().executeOnExecutor(AsyncTask.SERIAL_EXECUTOR ,"no is even"+i)

编辑:用于 Asynctask1 ,因此不使用相同的执行器

 new AsynTask1().executeOnExecutor(AsyncTask.THREAD_POOL_Executor,params);
于 2012-08-24T08:38:55.587 回答
0

尝试使用回调。在 AsyncTask 类中定义接口并在主类中实现它们。使用 AsyncTask2 的 onPostExecute 上的回调来启动下一个 AsyncTask2。你会保证订单。

 class AsyncTask2 extends AsyncTask<String, Void,Boolean<{
        //Your code. doInBackground must now return a boolean.
        protected Void onPostExecute(final Boolean success){
            myCallback listener = (myCallback) parentActivity;
            listener.call();
        }

        public Interface myCallback{
            void call();
        }
 }

然后在您的主要活动中实现 myCallback。

[编辑]

这是您可以执行的操作的示例。

Class MainActivity extends Activity implements myCallback{
    //Your code
    public void call(){
       new AsyncTask2().execute("no is even" + i);
    }
}
于 2012-08-24T08:37:00.423 回答
0
  1. 您不应该将 AsyncTask 用于长时间运行的线程(实现 AsyncTask1 的方式)。请参阅文档:http: //developer.android.com/reference/android/os/AsyncTask.html。只需为 AsyncTask1 正在做的事情创建一个单独的线程。

  2. 由于您需要在 AsyncTask2 中执行的操作需要串行执行,因此可以通过创建大小为 1 的 ThreadPool 来完成。

    // Creating ThreadPool
    ExecutorService service = Executors.newFixedThreadPool(1);
    
    // Submitting task
    service.execute(task);
    
    // Shutting down the thread pool when not required.
    service.shutdown();
    
于 2012-08-24T09:35:23.337 回答
-2
    int i=0;
    while(i<100)
    {
      new AsynTask1().execute();
        if(i%2==0)
      {
        new AsynTask2().execute("no is even"+i);
       }
        i++
    }
于 2012-08-24T08:37:55.557 回答