UI スレッドから非同期タスクを実行してから UI を変更することは、Android 開発の一般的な問題であるため、時間をかけて調査し、さまざまな手法を試してみて、自分に最適なものを見つけることにしました。
私が重要だと思ったこと:
- 確実に動作するはずです
- コードの可読性
Activity
またはFragment
、できるだけ多くのスレッド管理を排除する必要があります
以下は、さまざまな方法に関する私の印象 (間違っている可能性があり、一部は単なる意見です) の要約です。
非同期タスク
私が最初にAndroidに飛び込んだとき、私はsimple AsyncTask
withoutを使用していました:LoaderManager
- 断続的な問題が
AsyncTaskManager
あったため、アクティビティのライフサイクルでそれらを管理するために独自に作成しました。 - タスクの数にはいくつかの制限があり、メモリ リークが以前に報告されています。
- これらの最大の問題は、コードが非常に複雑になり、コードを単純化すると、そもそもそれらを使用する目的が損なわれることでした。
LoaderManager を使用した AsyncTaskLoader
これはこれを行うための推奨される方法のように思われるので、少し調査しました。
- これらについて少し読んだ後、この方法が推奨される主な理由は、
Fragment
ライフサイクルでタスクを管理するためであり、私の理解では、基本的に必要に応じてタスクを再起動するだけです。アクティビティが再開された後、アクティビティが再開される前に開始されたタスクの結果を受け取ることができないようです。 - すべてのタスクパラメーターは、オブジェクトである必要がある
Parcelable
かSerialiazable
、オブジェクトに入る必要があるようですBundle
。
ハンドラー、スレッド、メッセージ付き
これは私が落ち着いた方法です:
- 実装が簡単で、非常にカスタマイズ可能です。
- タスクを実行するスレッドにアクセスできます: 優先度の設定、デバッグ用のスレッド名の設定、デーモンの設定など。
- ボタンを何度もクリックし、結果とスレッドが点滅するのを見る目のテストに基づいて、AsyncTasks を使用するよりもはるかに応答性が高いようです ;) これをベンチマークすることができました。
- ライフ サイクルの問題を処理するために、メッセージを管理するシングルトン クラスを作成できます (プロセスが生きている間持続します)。特定のアクティビティのハンドラーが設定されていないときにそれらを保存し、見逃したメッセージを要求する場合はアクティビティ ハンドラーに転送します。つまり、タスクを同じパラメーターで再起動する必要はありません。これは、冪等でないタスクにとって重要な場合があります。
Handler
したがって、 、Threads
、およびを使用Messages
する方がはるかに優れたソリューションであるという結論に達しましたが、私が見たほぼすべての場所でAsyncTaskLoader
メソッドを使用することが推奨されていたため、何かが欠けていると確信しています。私は何が欠けていますか?
入力していただきありがとうございます。