5

Android 文档说 AsyncTaskpostExecute()在 UI 线程上被调用。我的印象postExecute()是从被调用的线程中execute()调用的:我一直在使用自己的线程的后台服务中使用 AsyncTask,并且在服务线程中调用了 postExecute(),而不是在主线程中。
但是,我最近遇到了一个根本没有调用 postExecute() 的问题,同时引发了异常:“向死线程上的处理程序发送消息”。

究竟是怎样的:
- AsyncTask 只能在主线程中使用吗?
- 如果不是,应该在哪个线程postExecute()中调用:总是 UI 线程,还是execute()调用线程?

谢谢

4

2 回答 2

14

在创建任务实例的线程上调用 AsyncTask 的 pre 和 postExecute 方法。在哪里调用 execute() 并不重要。您在其上创建任务的线程必须是 Looper 线程,并且在实践中应该始终是主线程(或 UI 线程)。

于 2010-07-21T16:28:36.980 回答
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 次...

于 2010-07-21T16:12:18.173 回答