5

アクティビティがローテーションのように onCreate/Destroy サイクルを通過するときに、フラグメント内でデータを保持するにはどうすればよいでしょうか?

私たちのセットアップでは、サーバーからフラグメント カスタム リスト アダプターにロードされる可能性のある大きなリストがあり、ローテーションでリロードしないようにすることで UX をスムーズにしたいと考えています。フラグメントを設定する際に発生した問題は、retainInstance=true; これは、アダプタが元のアクティビティのコンテキストへの参照を持っているため、メモリ リークが発生することです。データをフラグメントに保存して、アダプターを再作成するだけでよいでしょうか。もしそうなら、それは本当に適切な慣行ですか?

次のアイデアは、データをセッション シングルトン オブジェクトに格納し、ローテーション後に取得することです。これは、古いデータに関するいくつかの問題を提示しますが、簡単に克服できます。

*最善の解決策のように思われる他の選択肢は、データをバンドルに保存し、ローテーション後に新しいフラグメントに復元することです。ただし、アプリ全体に保存する必要があるオブジェクトがかなりあり、一部のオブジェクトは複雑で、リストや複数の型が含まれており、分割可能にするのが面倒です。より良い解決策はありますか?それとも、弾丸をかじって、Parcelable にする必要がありますか?

4

3 に答える 3

4

アクティビティがローテーション(など)でそれ自体を再作成しないようにするだけです。追加

android:configChanges="keyboardHidden|orientation|screenSize"

AndroidManifest.xmlのアクティビティ定義に追加します。そうすれば、ローテーションで何も保存する必要はありません。

編集:

そのソリューションが気に入らない場合は、onSaveInstanceStateメカニズムを使用する以外に選択肢はありません。複雑なデータがある場合は、クラスをシリアライズ可能にして、その方法でバンドルに追加するだけです。

于 2012-08-07T20:17:43.723 に答える
1

の設定

Android:configChanges

Android マニフェストの属性は、デフォルトの破棄と再作成の動作を無効にするための最もハックで、最も広く悪用されている回避策です。

詳細については、

フラグメントによる構成変更の処理:

http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html

于 2014-09-12T13:15:31.230 に答える
0

http://developer.android.com/guide/topics/resources/runtime-changes.htmlによると、アクティビティやビューなどに関連付けられていない限り、データをフラグメントに完全に保存できます。バンドル大量のデータ向けではなく、シリアル化が遅いため、フラグメントは大量のデータに最適です。

システムが onSaveInstanceState() コールバックで保存した Bundle を使用して、アクティビティの状態を完全に復元することはできない場合があります。バンドルは大きなオブジェクト (ビットマップなど) を運ぶように設計されておらず、その中のデータをシリアル化する必要があります。これにより、多くのメモリが消費され、構成の変更が遅くなる可能性があります。このような状況では、構成の変更によりアクティビティが再開されたときに Fragment を保持することで、アクティビティを再初期化する負担を軽減できます。このフラグメントには、保持したいステートフル オブジェクトへの参照を含めることができます。

于 2016-03-14T01:25:48.803 に答える