如何在另一个AsyncTask期间启动AsyncTask

时间:2013-03-01 04:45:20

标签: java android android-asynctask

主题代码是:

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通知 -

2 个答案:

答案 0 :(得分:0)

默认情况下,AsyncTask.execute在Android 3.0+上按the documentation on execute单线程化。

this blog,你可以用:( / p>)替换你的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。

答案 1 :(得分:0)

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

之外创建/执行asynctask实例