多个异步任务的问题

时间:2012-12-06 09:28:14

标签: android android-asynctask

我一次开始6 asyncTasks。但我的问题是我怎么知道返回了哪个异步任务onPostExecute()

3 个答案:

答案 0 :(得分:2)

IMO在这种情况下的最佳解决方案是在回调中传递某种AsyncTask。以下是它的完成方式:

  1. 创建回调界面:

    public interface OnTaskCompleteListener() {
        public void onTaskComplete(Void result);
    }
    
  2. 然后将此回调添加为AsyncTask的构造函数参数:

    public class MyAsyncTask extends AsyncTask { 
        private OnTaskCompleteListener listener; 
    
        public MyAsyncTask(OnTaskCompleteListener listener){ 
            this.listener=listener; 
        }
    
    
        @Override 
        protected void onPostExecute(Void result) {
            if (this.listener!=null) {
                this.listener.onTaskComplete(result);
            }
        }
    }
    
  3. 最后,在实例化AsyncTask时,为每个实例提供回调实现:

    //instance 1
    new MyAsyncTask(new OnTaskCompleteListener() {
        public void onTaskComplete(Void result) {
            //do something with the result
        }
    }).execute();
    
    //instance 2
    new MyAsyncTask(new OnTaskCompleteListener() {
        public void onTaskComplete(Void result) {
            //do something completely different here
            //this code doesn't interfere in any way with instance 1
        }
    }).execute();
    
  4. 请注意,您没有义务为每个AsyncTask实现回调,可以共享实现。

答案 1 :(得分:1)

首次引入时,AsyncTasks在单个后台线程上串行执行。从DONUT开始,这被改为一个线程池,允许多个任务并行运行。从HONEYCOMB开始,任务在单个线程上执行,以避免由并行执行引起的常见应用程序错误。

如果您真的想要并行执行,可以调用executeOnExecutor(java.util.concurrent.Executor, Object[]) with THREAD_POOL_EXECUTOR

了解更多信息。 http://developer.android.com/reference/android/os/AsyncTask.html

public final AsyncTask<Params, Progress, Result> executeOnExecutor (Executor exec, Params... params)

在API级别11中添加 使用指定的参数执行任务。任务返回自身(this),以便调用者可以保留对它的引用。

此方法通常与THREAD_POOL_EXECUTOR一起使用,以允许多个任务在由AsyncTask管理的线程池上并行运行,但您也可以使用自己的Executor进行自定义行为。

警告:允许多个任务从线程池并行运行通常不是您想要的,因为它们的操作顺序没有定义。例如,如果这些任务用于修改任何共同的状态(例如由于单击按钮而编写文件),则无法保证修改的顺序。如果没有仔细的工作,在较少的情况下,较新版本的数据可能会被较旧版本覆盖,从而导致模糊的数据丢失和稳定性问题。这些变化最好连续执行;为了保证此类工作是序列化的,无论平台版本如何,您都可以将此功能与SERIAL_EXECUTOR一起使用。

必须在UI线程上调用此方法。

答案 2 :(得分:1)

myTask extends AsyncTask{ 
int mTag; 
public AsyncTas(int tag){ 
this.mTag = tag; 
}


@Override protected void onPostExecute(Void arg0) {
super.onPostExecute(arg0); 
switch(tag){ .... } 

}

}