主体代码为:
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通知-
发布于 2013-03-01 13:17:40
根据Jellybean之后的Asynctask任务的文档部分,Asynctask实例必须在UI thread.and创建实例上创建,并在另一个asycntask的后台执行其操作,该asynctask是另一个工作线程而不是UI thread.So。您不应该在UI线程以外的其他线程中创建/执行asynctask的实例
发布于 2013-03-01 12:56:11
默认情况下,在安卓3.0+上,每个the documentation on execute的AsyncTask.execute都是单线程的。
对于每个this blog,您可以将您的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()来组合您的AsyncTasks,一个本地方法调用,调用您在AsyncTask2的doInBackground方法中所做的事情。
https://stackoverflow.com/questions/15150657
复制相似问题