私は2つのASyncTaskを持っています.1つはhttpPostから値を取得し、もう1つはUIの一部の要素(リストビューを含む)を更新します。 問題は、両方のASyncTaskが同じバックグラウンドスレッドを共有しているためです。ネットワークの開始が最初に開始され、遅い(ネットワーク接続不良のため)。他のバックグラウンドスレッドは、無責任なアプリにするには時間がかかりすぎます。他のユーザーをブロックするASyncTasks
両方の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);
}
}
なぜUIを更新するAsyncTaskがありますか?あなたは、Iiスレッドで同期させる必要があります。あなたのUI AsyncTaskはバックグラウンドスレッド上で何か他のことをしますか? –
私はそれをニュースのリストビューを表示するために使用します。 onPreExecuteでは、loading()UIを表示し、バックグラウンドでインターネットからニュースを取得し、onPostExecuteでアダプタをlistviewに割り当てます。そのアプローチは間違っていますか? – Addev
@Addev:なぜ最初の 'onPostExecute(...)'メソッドで2番目の 'AsyncTask'を起動しないのですか?必要なのは、一方のAsyncTaskが他のAsyncTaskの結果に依存していることです。その場合、事実上同期要件があり、2つの非同期操作を並行して実行するべきではありません。 – Squonk