30

LoaderCustomSupport (AsyncTaskLoader を使用) とFragmentRetainInstanceSupport (スレッドを使用、AsyncTask とほぼ同等) を見てください。

両方の例には、次の類似点があります。

  • どちらも、データの読み込み時に UI スレッドをブロックしません
  • ユーザーが画面の回転などの構成変更を行った場合、データ取得スレッドは破棄されません。
  • データ フェッチ スレッドがデータのフェッチを完了すると、正しいフラグメント UI に更新できます。

ただし、違いがあります。

AsyncTaskLoader

  • 中間の進行状況を進行状況バー ダイアログに更新する簡単な方法はないようです

非同期タスク

  • これについてはわかりません。しかし、Android のドキュメントでは、非同期データの読み込みと最終結果の UI への更新にAsyncTaskLoaderを推奨しているようです。

時間のかかる読み込みタスクを実行し、結果を Fragment の UI に更新するために、AsyncTaskLoader または AsyncTask のどちらを選択するかを決定するためのガイドラインまたは確認すべきチェックリストはありますか?

4

2 に答える 2

26

あなたの質問に興味を持ち、時々違いを調べようとしました。ここに私は私の観察を書いています。

  1. 早期終了の場合、AsyncTask を使用する非同期タスクはそのスレッドで引き続き実行されます。AsyncTaskLoader がアクティビティの早期終了を処理している間、結果の処理はすぐに要求されていない結果につながる可能性があります。

  2. AsyncTaskLoader は、アクティビティ構成の変更 (ユーザーが画面を回転させたときの IE) を処理します。

  3. AsyncTaskLoader は DataAdapters のロード データを意図しているため、この目的には AsyncTaskLoader を使用するのが最適ですが、タスクの完了後に UI (特にフラグメント) を変更する必要がある場合は、AsyncTaskLoader の onLoadFinished でフラグメントを変更できないため、AsyncTask を使用することをお勧めします。

だから私にとって、使い方はあなたの仕事に依存します。上記の 3 つの点が気にならない場合、パフォーマンスは同じです (ただし、ドキュメントは見つかりませんでしたが、この場合は asynctaskloader をお勧めします:S)

いくつかの関連リンク

AsyncTaskLoader と AsyncTask

http://andreas-kluck.blogspot.com/2012/02/asynctask-and-asynctaskloader.html

于 2013-03-12T10:15:49.623 に答える
0

AsyncTaskLoader は、すべてのローダーと同様に、ローテーションの問題を解決することを目的としています。これは、AsyncTask がアクティビティで作成され、タスクが完了する前にデバイスがローテーションされ、AsyncTask がアクティビティの破壊で失われる場合です。

現在、すべてのローダーが公開の進行状況をサポートしていないことは事実です。そのため、これが状況の要件である場合は、代替手段を検討する必要があります。ローテーション、またはアクティビティが破棄されるその他のイベントが問題にならない場合は、AsyncTask を使用するだけです。それ以外の場合は、サービスを使用し、バインダーを登録して進行状況メッセージを前後にプッシュすることをお勧めします。

私の意見では、サービスとバインダーのメッセージはちょっと面倒です。LocalBroadcastManagerを使用して IntentService (または AsyncTaskLoader) から進行状況のブロードキャストを送信し、Activity の BroadcastReceiver にブロードキャストを受信させて進行状況を表示させるのが、はるかに簡単な解決策だと思います。

于 2013-03-18T19:52:07.363 に答える