私は、ViewPagerの中で多数のフラグメントを使用するアプリケーションを作成しています。フラグメントをインスタンス化したり、そのフラグメントへの参照を保持する方がよいでしょうか?
これまで、私はいつもViewPagerに必要な各フラグメントの新しいインスタンスを提供しました。これは、Google開発者のすべての例がそうするべき正しいことだと思われます。
これらのフラグメントは親アクティビティを使用して状態/データを取得し、OnCreateViewで更新しました。
新しいフラグメントの1つは、NewsHeadersFragmentまたはNewsArticleFragmentを含むNewsFragmentであり、2人は通信する必要があります。
NewsHeaderFragmentのメッセージarticle_clicked(article)を自分のアクティビティに送信します(残念ながら親フラグメントと通信する方法が見つかりませんでした)。アクティビティはNewsFragmentにメッセージを送り、子フラグメントを変更します
これを行うには、私はNewsFragmentへの参照を保持しなければならないと思われるので、常にフラグメントの新しいインスタンスを作成する必要はないと考えていました。
私の質問は、NewsFragmentの新しいインスタンスを作成して参照を更新するほうがよいか、または参照がnullの場合にインスタンスを作成して常に参照を返すほうがよいでしょうか。
private static NewsFragment _news;
public static NewsFragment get_news_fragment() {
_news = NewsFragment.NewInstance();
return _news;
}
またはこの:
すなわち、この良いですか?あなたが必要なときに(Googleの開発者サンプルで行ったように)私は常に潜在的なOutOfMemoryException
のを防ぐためである一つの重要な理由のための断片を作成することをお勧めし
しかし、私はフラグメントへの静的な参照を保持しているので、フラグメントマネージャに存在しないときでも、ViewPagerがそれらを再び表示しようとすると、常に同じフラグメントを表示しますか?実際には、(新しいインスタンスを含む)1つのシナリオはフラグメントが常に作成され、破棄されることを意味し、もう1つは(参照付きで)それらが一度作成されて永遠に留まることを意味します。それは記憶的に優れていないのでしょうか? – Cruces
あなたは有効なポイントを作成します。しかし、フラグメント内で 'onDestroyed()'が呼び出されると、アンドロイドシステムはGCが次回の実行時にフラグメントをスイープすることを期待します。したがって、ライフサイクルがすでに終了しているフラグメントへの静的な参照を保持することで( 'onDestroyed()'と呼ばれる)この動作を中断することを強くお勧めしません。あなたは静的な参照に固執することがありますが、アンドロイドはさまざまなメモリサイズを持つさまざまなデバイス上で動作することを忘れないでください。ローエンドのデバイスでは、デバイスで動作するものが動作しないことがあります。 –