8

UI スレッドから非同期タスクを実行してから UI を変更することは、Android 開発の一般的な問題であるため、時間をかけて調査し、さまざまな手法を試してみて、自分に最適なものを見つけることにしました。

私が重要だと思ったこと:

  • 確実に動作するはずです
  • コードの可読性
  • ActivityまたはFragment、できるだけ多くのスレッド管理を排除する必要があります

以下は、さまざまな方法に関する私の印象 (間違っている可能性があり、一部は単なる意見です) の要約です。

非同期タスク

私が最初にAndroidに飛び込んだとき、私はsimple AsyncTaskwithoutを使用していました:LoaderManager

  • 断続的な問題がAsyncTaskManagerあったため、アクティビティのライフサイクルでそれらを管理するために独自に作成しました。
  • タスクの数にはいくつかの制限があり、メモリ リークが以前に報告されています。
  • これらの最大の問題は、コードが非常に複雑になり、コードを単純化すると、そもそもそれらを使用する目的が損なわれることでした。

LoaderManager を使用した AsyncTaskLoader

これはこれを行うための推奨される方法のように思われるので、少し調査しました。

  • これらについて少し読んだ後、この方法が推奨される主な理由は、Fragmentライフサイクルでタスクを管理するためであり、私の理解では、基本的に必要に応じてタスクを再起動するだけです。アクティビティが再開された後、アクティビティが再開される前に開始されたタスクの結果を受け取ることができないようです。
  • すべてのタスクパラメーターは、オブジェクトである必要があるParcelableSerialiazable、オブジェクトに入る必要があるようですBundle

ハンドラー、スレッド、メッセージ付き

これは私が落ち着いた方法です:

  • 実装が簡単で、非常にカスタマイズ可能です。
  • タスクを実行するスレッドにアクセスできます: 優先度の設定、デバッグ用のスレッド名の設定、デーモンの設定など。
  • ボタンを何度もクリックし、結果とスレッドが点滅するのを見る目のテストに基づいて、AsyncTasks を使用するよりもはるかに応答性が高いようです ;) これをベンチマークすることができました。
  • ライフ サイクルの問題を処理するために、メッセージを管理するシングルトン クラスを作成できます (プロセスが生きている間持続します)。特定のアクティビティのハンドラーが設定されていないときにそれらを保存し、見逃したメッセージを要求する場合はアクティビティ ハンドラーに転送します。つまり、タスクを同じパラメーターで再起動する必要はありません。これは、冪等でないタスクにとって重要な場合があります。

Handlerしたがって、 、Threads、およびを使用Messagesする方がはるかに優れたソリューションであるという結論に達しましたが、私が見たほぼすべての場所でAsyncTaskLoaderメソッドを使用することが推奨されていたため、何かが欠けていると確信しています。私は何が欠けていますか?

入力していただきありがとうございます。

4

2 に答える 2

7

あなたが見逃しているのは、クラスが好きAsyncTaskLoaderManager、Android を念頭に置いて書かれているということです。つまり、OS は、デスクトップ コンピューターと比較して最小限のハードウェアを最大限に活用するように設計されています。AsyncTask他のシステムよりもはるかに厳しいスレッド制限があるため、スレッドプールを制限します。100 以上のスレッドを生成しようとすると、新しいスレッドが拒否されるか、システムがクラッシュします。確かにThreadHandlerを使用できますが、管理に関しては自己責任です。

最後に聞いた話でAsyncTaskは、キューの深さが 10 タスクの 10 スレッドをサポートしています (後のバージョンでは増加している可能性があります)。これが制限されている場合は、いつでもソースを取得して独自に作成できます。以前やったことがあります。あなたが考慮したい重要なことは、将来、あまりにも多くのスレッドを生成するという問題に遭遇する可能性があるかどうか、もしそうなら、どのように対処するかです.

LoaderManagerとの使用が推奨される理由についての質問に答えるにはAsyncTaskLoader、単に便利です。これは、データをリロードして、そのデータに依存するコードの部分に取得する簡単な方法です。すべての状況で保証されるわけではありません。

于 2012-10-29T07:40:01.720 に答える
4

Handler、、、ThreadsおよびMessagesは低レベルのクラスです。これにより、柔軟性が得られます。特定の問題を解決するのに適していると思われる場合は、それらを組み合わせることができます。ただし、スレッドの停止/開始、正しいスレッドへのルーティング、アクティビティの再作成時のインスタンスの保存/復元または再作成など、多くの低レベルのものにも注意を払う必要があります。

ローダーはこのほとんどを処理し、アクティビティにデータをロードするという1つの特定の問題をうまく解決するように設計されています。最大の利点は、アクティビティが再作成されたときにActivity(またはFragmentActivity)がローダーの管理と再起動を処理することです(これは、リークせずに正しく実行するのは非常に困難です)。また、データをキャッシュするため、これを自分で行う必要はありません。とはいえ、少し違うことをしたい場合は、ローダーの使用が厄介になる可能性があります。したがって、より柔軟性が必要な場合は、を検討してAsyncTaskください。それが合わない場合は、1レベル下に移動して、を使用ThreadsHandlerます。

于 2012-10-29T09:23:37.173 に答える