5

Androidのドキュメントによると、AsyncTaskpostExecute()はUIスレッドで呼び出されます。postExecute()呼び出されたスレッドから呼び出されたという印象を受けましたexecute()。独自のスレッドを持つバックグラウンドサービスでAsyncTaskを使用しており、postExecute()はメインスレッドではなくサービススレッドで呼び出されました。
ただし、最近、postExecute()がまったく呼び出されないという問題が発生しましたが、例外がスローされました:「デッドスレッドのハンドラーにメッセージを送信する」。

正確にはどうですか:
-AsyncTaskはメインスレッドからのみ使用されますか?
-そうでない場合、どのスレッドpostExecute()が呼び出されることになっていますか:常にUIスレッド、またはexecute()呼び出し元のスレッド?

ありがとうございました

4

2 に答える 2

14

AsyncTaskのpreおよびpostExecuteメソッドは、タスクインスタンスが作成されたスレッドで呼び出されます。execute()をどこで呼び出すかは重要ではありません。タスクを作成するスレッドはルーパースレッドである必要があり、実際には常にメインスレッド(または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 に答える