【问题标题】:Issue with multiple async tasks多个异步任务的问题
【发布时间】:2014-01-30 15:39:50
【问题描述】:

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

【问题讨论】:

标签: android android-asynctask


【解决方案1】:

IMO 在这种情况下最好的解决方案是将某种回调传递给您的每个AsyncTasks。以下是它的完成方式:

  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();
    

请注意,您没有义务为每个AsyncTask 实现回调,可以共享实现。

【讨论】:

    【解决方案2】:
    myTask extends AsyncTask{ 
    int mTag; 
    public AsyncTas(int tag){ 
    this.mTag = tag; 
    }
    
    
    @Override protected void onPostExecute(Void arg0) {
    super.onPostExecute(arg0); 
    switch(tag){ .... } 
    
    }
    
    }
    

    【讨论】:

      【解决方案3】:

      首次引入时,AsyncTask 是在单个后台线程上串行执行的。从 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 线程上调用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多