3

Android プロジェクトで AsyncTask をサブクラス化します。

現在のタスクに時間がかかりすぎる場合に、ユーザーが現在の AsyncTack をキャンセルして新しいタスクを開始できるようにする機能を実装したいと考えています。

MyAsyncTask mat = new MyAsyncTask();

ユーザーがキャンセル ボタンをクリックすると、次のコードを実装して新しいタスクを開始します。

mat.cancel(true);

ただし、古いタスクが終了するまで新しいタスクが開始されないことに後で気付きます。古いタスク トレッドはまだ実行中です。

Google で公式ドキュメントを確認しました。doInBackGroud(Params... params)で次のステートメントを呼び出す必要があるようです。

if (isCancelled()) break;

問題は、以下のコードが時間がかかる原因であることがわかりました。

DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
HttpResponse httpResponse = httpClient.execute(httpPost);

しかし、 httpClient.execute(httpPost)の実行中にタスクがキャンセルされたかどうかを確認するにはどうすればよいですか? DefaultHttpClient でオーバーライドできるonProgressChanged(int progress)のようなメソッドはありますか?

4

3 に答える 3

1

現在のタスクに時間がかかりすぎる場合に、ユーザーが現在のAsyncTackをキャンセルして、新しいAsyncTackを開始できるようにする機能を実装したいと思います。

古いタスクが終了するまで新しいタスクを開始できないため、Asyntaskの新しいインスタンスを作成できます。実際、AsyncTaskのインスタンスを複数回使用するのは悪い考えです。あなたの後

HttpResponse httpResponse = httpClient.execute(httpPost);

キャンセルされたか確認できます

if(!isCanceled()){

}

スレッドルールの下のドキュメントの最後の行を見てください。 コメントが指摘したように
更新します。プラットフォームによって異なりますので、実行する前にプラットフォームのバージョンを確認してください。

   if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB) {
      myTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
    }
    else {
      myTask.execute();
    }
于 2013-02-07T16:34:56.617 に答える
1

abortオブジェクトを呼び出して、リクエストを中止する必要がありhttpPostます。これにより、executeメソッドはすぐに戻り、スレッドのブロックを停止します。

于 2013-02-07T16:36:07.943 に答える
0

私は実際にはAsyncTaskの使用を完全に避けます。AsyncTasksはメモリリークが発生しやすく、Activityライフサイクルとの関連性が低いため、問題が発生する可能性があります。

RoboSpiceの使用を検討してください。質問を解決するのに役立つだけでなく、AsyncTasksの問題を回避し、HttpClientを使用して手動で何かを書く必要がなくなります。私はRoboSpiceの開発者ではありませんが、最近使い始めたので、すばらしいプロジェクトです。

于 2013-02-07T17:01:31.330 に答える