我asyncTasks
一次开始6个。但我的问题是我怎么知道onPostExecute()
返回了哪个异步任务。
3 回答
在这种情况下,IMO 最好的解决方案是将某种回调传递给您的每个AsyncTask
s。这是如何完成的:
创建你的回调接口:
public interface OnTaskCompleteListener() { public void onTaskComplete(Void result); }
然后将此回调添加为您的构造函数参数
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); } } }
最后,在实例化您的 时
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();
请注意,您没有义务为 each 实现回调AsyncTask
,可以共享实现。
首次引入时,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 线程上调用。
myTask extends AsyncTask{
int mTag;
public AsyncTas(int tag){
this.mTag = tag;
}
@Override protected void onPostExecute(Void arg0) {
super.onPostExecute(arg0);
switch(tag){ .... }
}
}