Android文档说在UI线程上调用了AsyncTask postExecute()
。我的印象是postExecute()
从调用execute()
的线程调用:我一直在后台服务中使用AsyncTask并使用自己的线程,并在服务线程中调用了postExecute() ,而不是主线
但是,我最近遇到了一个问题,即postEecute()根本没有被调用,而抛出异常:“在死线程上向处理程序发送消息”。
究竟如何:
- 只能从主线程中使用AsyncTask吗?
- 如果没有,应调用哪个线程postExecute()
:总是UI线程,还是execute()
调用线程?
谢谢
答案 0 :(得分:14)
在创建任务实例的线程上调用AsyncTask的pre和postExecute方法。你调用execute()的地方并不重要。创建任务的线程必须是一个looper线程,实际上应该始终是主线程(或UI线程)。
答案 1 :(得分:2)
似乎你可以从主线程之外的其他地方启动AsyncTask但是postExecute实际上是在主线程上执行的。 这是我的测试,告诉我你是否合乎逻辑:
public class AsyncLoader extends AsyncTask<Context, String, Boolean> {
private ConnectivityManager cm;
private ArrayList<Contact> nameList;
private Context ctx;
private static int i = 0;
@Override
protected Boolean doInBackground(Context... params) {
ctx = params[0];
cm = (ConnectivityManager) params[0].getSystemService(Activity.CONNECTIVITY_SERVICE);
if (i < 3) {
i++;
new AsyncLoader().execute(ctx);
System.out.println("Thread name (from doInBackground) : " + Thread.currentThread().getName());
System.out.println("compteur async " + i);
}
if (cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isAvailable()) {
nameList = (ArrayList<Contact>) ContactLoaderXml.loadContactsData(); //this is a loading from the web + sax parser
return true;
} else {
return false;
}
}
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
System.out.println("Thread name (from postexecute) : " + Thread.currentThread().getName());
}
}
这是任务之后的堆栈跟踪:
I/System.out( 641): Thread name (from doInBackground) : AsyncTask #1
I/System.out( 641): compteur async 1
I/System.out( 641): Thread name (from doInBackground) : AsyncTask #2
I/System.out( 641): compteur async 2
I/System.out( 641): Thread name (from doInBackground) : AsyncTask #3
I/System.out( 641): compteur async 3
I/System.out( 641): Thread name (from postexecute) : main
I/System.out( 641): Thread name (from postexecute) : main
I/System.out( 641): Thread name (from postexecute) : main
I/System.out( 641): Thread name (from postexecute) : main
我不知道为什么后期执行已完成4次但是......