Androidアプリケーションをダウンロードするファイルがあります。ユーザーがリストビューアイテムをクリックすると、ファイルがダウンロードされます。正常に動作します。ここで、現在のファイルのダウンロードをキャンセルして、ユーザーが他のアイテムをタップし、別のダウンロードがすでに進行している間に次のファイルを開始し、ダウンロードタスクをキャンセルする前にユーザーの確認を表示したいと思います。
これどうやってするの?
前もって感謝します
Androidアプリケーションをダウンロードするファイルがあります。ユーザーがリストビューアイテムをクリックすると、ファイルがダウンロードされます。正常に動作します。ここで、現在のファイルのダウンロードをキャンセルして、ユーザーが他のアイテムをタップし、別のダウンロードがすでに進行している間に次のファイルを開始し、ダウンロードタスクをキャンセルする前にユーザーの確認を表示したいと思います。
これどうやってするの?
前もって感謝します
まず、チェックインする必要がありますAsyncTask
// in doInBackground, check if asynctask is canceled manually
if (isCancelled()) break;
あなたの活動では、キャンセルしようとするときはいつでも、手動でキャンセルするだけAsyncTask
です。もちろん、新しいファイルを開始して別のファイルをダウンロードしてください。
mDownloadingTask.cancel(true);
単純に、Asynctaskを変数に格納します。
mDownloadingTask = new Asynctask(){...};
mDownloadingTask.execute();
このタスクを停止して新しいタスクを開始する場合:
//close the current task if it # null
mDownloadingTask.cancel(true);
mDownloadingTask = null;
//Start new one
mDownloadingTask = new Asynctask(){...};
mDownloadingTask.execute();
Cancel(false)
フラグを設定します。フラグをチェックインしdoInBackGround()
て、コードが実行することを停止できます。cancel(true)
スレッドを中断することを除いて、同じことを行います。割り込みの詳細については、こちらをご覧ください。
これは、タスクにループコードがある場合にすべて有効です。ループを繰り返すたびに、を確認できますisCancelled()
。
しかし、あなたの質問のように、ファイルのダウンロードなどの一部のタスクはループを使用しません。おそらく、外部APIメソッドを呼び出しているだけなので、ここでは、このブロッキングメソッドに翻弄されています。適切に設計されている場合、割り込みが発生すると例外がスローされ、スレッドが終了します。
また、より良い実装を見てください、SafeAsyncTask