Android:AsyncTask可以在另一个线程中返回UI线程吗?

时间:2010-07-21 15:20:57

标签: android multithreading android-asynctask

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

究竟如何:
- 只能从主线程中使用AsyncTask吗? - 如果没有,应调用哪个线程postExecute():总是UI线程,还是execute()调用线程?

谢谢

2 个答案:

答案 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次但是......