13

バックグラウンドで何かを実行してから UI を更新することは、Android で正しく実装するのが非常に困難です。単純に設計が悪い。典型的な例は、Web から何かをフェッチして結果を表示する AsyncTask です。これには 2 つの問題があります。

  1. AsyncTask には Activity への参照があります (UI を更新する必要があるため)。画面の向きを変更した後、Activity を再起動します。ただし、AsyncTask はまだ古い破棄されたアクティビティを参照しているため、新しいアクティビティの UI を更新できません。

  2. これにより、OutOfMemoryException が発生する可能性があります。多くのビットマップを含むアクティビティがあり、AsyncTask を開始するとします。BACK を押します (Activity は終了しました) が、AsyncTask はまだ実行中であり、Activity を参照しているため、ビットマップを含む Activity はまだメモリ内にあります。これを繰り返すと(アクティビティを開始して戻る)、遅かれ早かれ強制終了します。

これは解決できますが、複雑すぎます。1 つのアクティビティに 3 つの異なる AsyncTasks があり、それぞれが複数のインスタンスで同時に実行できます。これを正しく実装するのはイライラします。コードの理解とデバッグが非常に難しくなります。

ハニカムローダーはどうにかしてこれを解決できますか? また、ハニカム以前の Android バージョンでそれらを使用する方法はありますか?

4

2 に答える 2

7

はい、私の経験Loaderからすると、人々が抱えている一般的な問題AsyncTasksや構成の変更を解決しているようです。

私は、Google がフラグメントの静的ライブラリにLoadersも同様に含めると言ったと思うので、そうです。ライブラリがリリースされたときに、それらも逆方向に動作するはずです。

于 2011-02-23T22:25:43.327 に答える
4

これは Honeycomb ローダーに関する質問には答えませんが、次のリンクには、AsyncTasks の向きの変更を簡単に処理するパターンがあります。

http://evancharlton.com/thoughts/rotating-async-tasks/

他にもいくつかの素晴らしい投稿があります。

更新: OPがコメントで指摘したように、これは構成(向き)の変更に対してのみ機能しますが、[戻る]ボタンを使用してホームメニューまたはタスクリストから再起動すると機能しません。

一度に 1 つの AsyncTask が必要な場合は、Activity 内で AsyncTask への静的参照を使用できます。もう 1 つのオプションは、Application への参照を保存することです。

次に、新しいアクティビティが開始されると、実行中の AsyncTask があるかどうかを確認し、それ自体を現在のアクティビティとして設定します (AsyncTask のセッターを介して)。AsyncTask 内のアクティビティへのアクセスを必ず同期してください。

于 2011-02-23T21:53:12.177 に答える