我有 2 个 ASyncTasks,一个从 httpPost 检索值,另一个更新 UI 的一些元素(包括列表视图)。
问题是,由于两个 ASyncTasks 共享相同的后台线程,如果网络操作首先启动并且运行缓慢(由于网络连接不良)。其他后台线程花费太多时间,使应用程序不负责任。
由于两个 ASyncTasks 都是独立的,因此让另一个 ASyncTasks 等待是非常愚蠢的。不同的类使用不同的线程会更符合逻辑,我错了吗?
正在阅读异步任务 http://developer.android.com/reference/android/os/AsyncTask.html文档。谈论使用执行执行器(),但是在 API 级别低于 11 的情况下如何解决这个问题呢?
这是一个重现“问题”的小例子
new Task1().execute();
new Task2().execute();
With
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
and Task2
分别。 Honeycomb 中出现了 AsyncTask 的基本变化(请参阅 Android SDK 文档here http://developer.android.com/reference/android/os/AsyncTask.html在“执行顺序”部分),所以在此之前,您像往常一样启动它,对于 HC 及更高版本,使用executeOnExecutor()
如果你不喜欢新的行为(我想没有人喜欢)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)