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,但在 Jelly Bean 更新后无法正常工作。为什么?

2.3.5

AsyncTask1 通知 +

AsyncTask2 通知 +

4.2(更新后):

AsyncTask1 通知 +

AsyncTask2 通知 -

4

2 回答 2

0

根据 Jellybean 之后 Asynctask 任务的文档部分,必须在 UI 线程上创建 Asynctask 实例。并且您创建实例 n 在另一个 asycntask 的后台执行其操作,这是另一个工作线程而不是 UI 线程。所以你不应该创建/在非 UI 线程中执行 asynctask 的实例

于 2013-03-01T05:17:40.300 回答
0

默认情况下,AsyncTask.execute 在 Android 3.0+ 上是单线程的,根据 execute 的文档

根据此博客,您可以将 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 方法中所做的本地方法调用来组合您的 AsyncTask。

于 2013-03-01T04:56:11.290 回答