主题代码是:
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通知 -
答案 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实例