0

件名コードは次のとおりです。

public class AsyncTask1 extends AsyncTask <Void, Void, Boolean>{
    @Override
    protected Boolean doInBackground(Void... params){
        //...
        asyncTask2 = new AsyncTask2();
        //...
        Log.i("AsyncTask1","Launch asyncTask2");
        String taskResult = tasyncTask2.execute().get().toString();
        //...
    }
    //...
}

public class AsyncTask2 extends AsyncTask <Void, Void, String>{
//...
@Override
protected String doInBackground(Void... params){
    Log.i("AsyncTask2", "I have started");
    //...
}
//...
}

このコードテンプレートは2.3.5および4.2で機能しますが、JellyBeanの更新後は機能しません。なんで?

2.3.5

AsyncTask1通知+

AsyncTask2通知+

4.2(更新後):

AsyncTask1通知+

AsyncTask2通知-

4

2 に答える 2

0

Jellybeanの後のAsynctaskタスクのドキュメント部分に従って、AsynctaskインスタンスはUIスレッドで作成する必要があります。インスタンスnを作成すると、UIスレッドではなく別のワーカースレッドである別のasycntaskのバックグラウンドで操作を実行します。したがって、作成しないでください。 /UIスレッド以外の非同期タスクのインスタンスを実行します

于 2013-03-01T05:17:40.300 に答える
0

デフォルトでは、AsyncTask.executeは、executeのドキュメントに従って、Android3.0以降ではシングルスレッドです。

このブログによると、 tasyncTask2.execute ()。get()。toString()を次のように置き換えることができます。

String taskResult;
if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB) {
    taskResult = tasyncTask2.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR).get().toString();
}
else {
    taskResult = tasyncTask2.execute().get().toString();
}

または、tasyncTask2.execute()。get()。toString()をAsyncTask2のdoInBackgroundメソッドで実行するローカルメソッド呼び出しに置き換えて、AsyncTasksを結合します。

于 2013-03-01T04:56:11.290 に答える