2013-03-01 46 views
0

主题代码开始的AsyncTask是:如何在另一个的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,但经过果冻豆更新它不工作。为什么?

2.3.5

AsyncTask1通知+

AsyncTask2通知+

4.2(更新之后):

AsyncTask1通知+

AsyncTask2通知 -

回答

0

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

0

通过默认的AsyncT ask.execute在Android 3.0+上的单线​​程数为the documentation on execute

this blog,您可以取代你tasyncTask2.execute()得到()用的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结合您AsyncTasks()得到()。 toString()方法调用您在AsyncTask2的doInBackground方法中执行的操作。

+0

THREAD_POOL_EXECUTOR因为API等级11 – Sunshine 2013-03-01 05:12:47

+0

@Sunshine说 - 是的,Build.VERSION_CODES.HONEYCOMB === 11 – ianhanniballake 2013-03-01 05:14:55

+0

什么GINGERBREAD_MR1?你能提出一些建议吗? – Sunshine 2013-03-01 05:18:04