我有2个ASyncTasks,一个从httpPost获取一个值,另一个更新UI的一些元素(包括一个列表视图)。 问题是,由于两个ASyncTasks共享相同的后台线程,如果网络操作首先启动并运行缓慢(由于网络连接不良)。其他后台线程花费太多时间让应用程序不负责任。阻止他人的异步任务
由于两个ASyncTasks都是独立的,所以非常愚蠢,一个要等待另一个。这将是更合乎逻辑的asynctasks不同的类使用不同的线程,我错了吗?
阅读ASyncTask文档。谈论使用executeOnExecutor(),但我如何解决在API级别低于11?
这里去再现 “问题”
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);
}
}
为什么你有一个AsyncTask来更新UI?您需要在Ii线程上同步执行此操作。你的UI AsyncTask在后台线程上做了些什么吗? –
我用它来显示新闻的列表视图。在onPreExecute中,显示loading()UI,在后台从Internet中检索新闻,并在onPostExecute中将适配器分配给listview。这种方法不正确吗? – Addev
@Addev:你为什么不直接在第一个'onPostExecute(...)'方法中启动第二个'AsyncTask'?如果你需要的是'AsyncTask'依赖另一个的结果,那么你实际上有一个同步需求,你不应该并行运行两个异步操作。 – Squonk