gpt4 book ai didi

android - ASyncTasks 阻止其他人

转载 作者:IT老高 更新时间:2023-10-28 22:01:35 26 4
gpt4 key购买 nike

我有 2 个 ASyncTask,一个从 httpPost 检索值,另一个更新 UI 的一些元素(包括 ListView )。问题在于,由于两个 ASyncTask 共享相同的后台线程,如果网络操作首先启动并且运行缓慢(由于网络连接不良)。其他后台线程耗时太长,导致应用不负责任。

由于两个 ASyncTask 都是独立的,因此让另一个等待另一个是非常愚蠢的。不同的类使用不同的线程会更符合逻辑,我错了吗?

阅读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);
}

}

最佳答案

这就是我在代码中处理这个问题的方式:

if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ) {
new MyAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
new MyAsyncTask().execute();
}

并将 MyAsyncTask 分别替换为您的 Task1Task2。基本上 AsyncTask 的变化出现在 Honeycomb 中(请参阅 Android SDK 文档 here 在“执行顺序”部分),因此在此之前,您像往常一样启动它,对于 HC 及更高版本,使用 executeOnExecutor()如果你不喜欢新的行为(我认为没有人喜欢)

关于android - ASyncTasks 阻止其他人,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12168693/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com