好的,我创建了一个Fragment
带有一些UI(几个文本框和内容),我使用setRetainInstance
,因为我运行AsyncTask
来查询服务器(请求只能发送一次)我需要AsyncTask
的结果。所以我的问题是:
用UI保留整个片段是错误的吗?我看到了几个例子,人们使用额外的Fragment
来使用setRetainInstance
,但是......有没有什么不对的?
如果使用setRetainInstance
存在问题,为什么会这样?无法在文档中找到有关此内容的任何信息。
答案 0 :(得分:2)
即使您使用setRetainInstance(true)
,您的片段仍会在您轮播时重新创建其视图(您将调用onDestroyView
然后onCreateView
)。只要您不保留对onDestroyView
之后的视图的引用,旧活动就不会有任何泄漏。最好的方法是明确地使onDestroyView
中的引用为空,但是onCreateView
中的代码通常会覆盖这些引用。
网上有许多例子(包括一些官方的例子),人们使用单独的片段(没有视图)来保留数据。假设我上面说的是正确的,那么这是不必要的(为了防止泄漏)。在许多情况下,如果您使用一个单独的片段,您可能最终会使用更清晰的代码/体系结构,该片段的职责就是处理数据而不用担心UI。
您可以在using Eclipse MAT之后检查是否在泄露活动上下文。
答案 1 :(得分:-1)
如果您正在锁定方向,那么您应该没问题。否则,如果保留与特定活动实例关联的小部件,则最终可能会导致内存泄漏。