基本的に 2 つのオプションがあります。どちらが優れているかを判断するのは簡単ではありません。
AsyncTask
ここでは確かにオプションです。優れた点は、UI との同期を構成することです。計算結果をdoInBackground()
(同時に実行される) からonPostExecute()
(UI スレッドで実行される) に渡すので、計算を実行して UI を安全に更新できます。publisProgress()
/onProgressUpdate()
メソッドのペアを介して、UI スレッドでのバックグラウンド処理の進行状況を示すこともできます。
ただし: AsyncTask の動作は、API 1 と API 17 の間で 2 回変更されました。デバイスが実行する Android のバージョンに応じて、デフォルトで、複数の AsyncTask を並行して実行するかどうかを指定できます。executeOnExecutor()
これが重要な場合は、使用する必要があります。この呼び出しは API 11 で導入されました。つまり、11 より前の API をサポートする場合は、リフレクションに対処する必要があります。
2 番目のオプションは、明示的な worker を使用することThread
です。このアプローチの魅力は、アプリで頻繁に発生し、バックグラウンドで実行する必要があるタスク専用のスレッドがあることです。ただし、UI 同期の問題はすべて自分で処理する必要があります。規律があれば難しいことではありません。View
変更が必要なオブジェクトをThread が認識している場合はView.post()
、View.postDelayed()
などのメソッドを使用して、ビューへの参照を持ち、UI スレッドで実行されるコードのフラグメントをスケジュールできます。
どちらのアプローチを選択しても、さらに 2 つの影響に直面します。
Android はあなたThread
とあなたの両方AsyncTask
をバックグラウンド優先で実行します。CPU を集中的に使用する場合、調整しないと実行時間が 10 倍になります。詳細な議論については、AsyncTask に対する私の回答を参照してください。.
非同期タスクでの View 参照には注意が必要です。ユーザーが [戻る] を押したか、デバイスの回転などの構成変更によりアクティビティが再作成されたため、ビューが存在しなくなった可能性があります。これが意味することは、多くの場合、Activity から出てすぐに再入力することで、多くのスレッドを開始する方法をユーザーに提供し、表示されなくなった View オブジェクトへの参照を保持する Threads をどんどん追加していることです。賢くなりたいのに計算に時間がかかる場合は、スレッドを新しいアクティビティに再アタッチすることをお勧めします (状況によって異なります)。スレッドがクリーンな方法で終了し、アクティビティがなくなった場合にすべてのリソースを解放することを確認する場合は、今のところこれを無視しても安全です。