始终实例化片段或保持对它的引用是否更好?

时间:2016-06-17 09:50:00

标签: android android-fragments

我正在ViewPager中创建一个使用大量片段的应用程序。

到目前为止,我总是向ViewPager提供所需的每个片段的新实例,因为谷歌开发者的所有示例似乎都说,这是正确的事情。

这些片段使用其父Activity来检索其状态/数据并在OnCreateView中自行更新。

其中一个新片段是一个NewsFragment,其中包含NewsHeadersFragment或NewsArticleFragment,这两者需要进行通信。

我所做的是将来自NewsHeaderFragment的消息article_clicked(文章)发送到我的Activity(不幸的是我还没有找到与父片段通信的方式),并且Activity向NewsFragment发送消息以更改其子片段< / p>

为了做到这一点,我似乎必须保留对NewsFragment的引用,所以我想也许我不应该总是创建一个新的片段实例。

我的问题是,最好总是创建一个新的NewsFragment实例并只更新引用,或者只在引用为null时创建一个实例并始终返回引用。

即。这是更好的:

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

还是这个?

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

提前感谢您提供的任何帮助

3 个答案:

答案 0 :(得分:1)

我建议在需要时始终创建片段(如谷歌开发者样本中所做的那样),这是防止潜在OutOfMemoryException的一个重要原因。在其生命周期之外对片段/活动进行硬性引用会使垃圾收集难以辨认,并为臭名昭着的OOM铺平道路。

对于您的场景,我建议您尝试使用某种EventBus(发布/订阅机制)从您的活动到片段进行通信。

答案 1 :(得分:0)

最好创建一个新片段。但是,它还取决于你想要做什么。如果你做异步,或使用观察者模式,保持参考更好

答案 2 :(得分:0)

您要在NewsFragment中共享的数据,您可以在系统上下文类中使用它并将数据存储在那里(getter / setter),但是您只需要调用此类方法,而不是每次都创建片段的实例。