2016-06-17 9 views
1

私は、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のを防ぐためである一つの重要な理由のための断片を作成することをお勧めし

答えて

1

を提供することができる任意の助けを事前に

private static NewsFragment _news; 
public static NewsFragment get_news_fragment() { 
    if (_news == null) _news = NewsFragment.NewInstance(); 
    return _news; 
} 

感謝。そのライフサイクルの外にあるフラグメント/アクティビティへのハードリファレンスを維持することは、ガベージコレクションのために読みにくくなり、悪名高いOOMのための道を開くことになります。

あなたのシナリオでは、EventBus(pub/subメカニズム)を試して、あなたのアクティビティからフラグメントに通信することをお勧めします。

+0

しかし、私はフラグメントへの静的な参照を保持しているので、フラグメントマネージャに存在しないときでも、ViewPagerがそれらを再び表示しようとすると、常に同じフラグメントを表示しますか?実際には、(新しいインスタンスを含む)1つのシナリオはフラグメントが常に作成され、破棄されることを意味し、もう1つは(参照付きで)それらが一度作成されて永遠に留まることを意味します。それは記憶的に優れていないのでしょうか? – Cruces

+0

あなたは有効なポイントを作成します。しかし、フラグメント内で 'onDestroyed()'が呼び出されると、アンドロイドシステムはGCが次回の実行時にフラグメントをスイープすることを期待します。したがって、ライフサイクルがすでに終了しているフラグメントへの静的な参照を保持することで( 'onDestroyed()'と呼ばれる)この動作を中断することを強くお勧めしません。あなたは静的な参照に固執することがありますが、アンドロイドはさまざまなメモリサイズを持つさまざまなデバイス上で動作することを忘れないでください。ローエンドのデバイスでは、デバイスで動作するものが動作しないことがあります。 –

0

新しいフラグメントを作成することをお勧めします。しかし、それはあなたがそれらで何をしたいかによっても異なります。非同期を使用するかオブザーバーモードを使用する場合は、参照を保持する方が良い

+0

サーバからデータをロードし、新しいデータがあることを適切なフラグメントに通知するなど、非同期のものを使用しますが、参照を保持する必要がなくコールバックでこれを行うことができます – Cruces

+0

どういう意味ですかオブザーバーモードで? – Cruces

+0

申し訳ありませんが、オブザーバーパターンである必要があります。私が言いたいのは、インスタンスを維持する必要があるときです。 –

0

NewsFragment内で共有したいデータは、システムコンテキストクラスに保存してデータをそこに保存することができますが(getter/setter)毎回フラグメントのインスタンスを作成するのではなく、このクラスのメソッドを呼び出すだけで済みます。

+0

私は実際にフラグメントに保持されているデータを持っていないので、現時点のデータはすべてメインアクティビティに格納されていますか、アプリケーションのアプリケーションシングルトン – Cruces

+0

です。フラグメントが第三者を通じて共同作業する必要があることを示します。 MainActivityは、NewsFragmentにArticleFragmentが表示されることを通知し、そのフラグメントがOnCreateViewメソッドを実行すると、MainActivityに表示する記事を要求します。たとえば、次のようになります。しかし、私はfragmentManager(サポートライブラリを使用していない)でフラグメントを見つけることができないので、私はそこへの参照を保持することしか考えられませんでした – Cruces

関連する問題