2つのASyncTasksがあります。1つはhttpPostから値を取得し、もう1つはUIのいくつかの要素(リストビューを含む)を更新します。問題は、両方の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);
}
}