我有2个ASyncTasks,一个用于从httpPost检索值,另一个用于更新UI的某些元素(包括列表 View )。
问题在于,由于两个ASyncTasks共享同一个后台线程,因此如果网络运行首先启动并且运行缓慢(由于网络连接不良)。其他后台线程花费太多时间,使应用程序不负责任。
由于两个ASyncTasks都是独立的,所以让另一个等待很愚蠢。不同的类使用不同的线程会更具逻辑性,这是我错了吗?
阅读ASyncTask文档。谈论使用 executeOnExecutor(),但是如何在低于11的API级别解决该问题?
这里有一个小例子,再现了“问题”
new Task1().execute();
new Task2().execute();
用
public class Task1 extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
GLog.e("doInBackground start 1");
SystemClock.sleep(9000);
GLog.e("doInBackground end 1");
return null;
}
@Override
protected void onPreExecute() {
GLog.e("onPreExecute 1");
super.onPreExecute();
}
@Override
protected void onPostExecute(Void result) {
GLog.e("onPostExecute 1");
super.onPostExecute(result);
}
}
public class Task2 extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
GLog.e("onPreExecute 2");
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... params) {
GLog.e("doInBackground start 2");
SystemClock.sleep(9000);
GLog.e("doInBackground end 2");
return null;
}
@Override
protected void onPostExecute(Void result) {
GLog.e("onPostExecute 2");
super.onPostExecute(result);
}
}
最佳答案
这是我在代码中处理此问题的方式:
if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ) {
new MyAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
new MyAsyncTask().execute();
}
并分别用您的
MyAsyncTask
和Task1
替换Task2
。基本上,AsyncTask中的更改出现在Honeycomb中(请参见“执行顺序”部分中的Android SDK文档here),因此在此之前,请像往常一样启动它,对于HC及更高版本,如果您不喜欢新行为(请不要这样做,请使用executeOnExecutor()
,我认为)