2012-05-16 42 views
7

好吧,我创建了一个Fragment一些UI(夫妇文本框和东西),我用setRetainInstance因为进出口运行的AsyncTask来查询服务器(要求只能用一次发送),我需要的结果为AsyncTask。所以我的问题是: 用UI保留整个片段是错误的吗?我看到一些例子,其中人们使用额外的Fragment来使用setRetainInstance但是..有没有什么错误不使用额外的? 如果使用setRetainInstance时出现问题,为什么?在文档中找不到关于此的任何信息。setRetainInstance片段与UI的Android

回答

-1

如果你锁定你的方向,那么你应该没问题。否则,如果您保留与特定活动实例关联的小部件,则最终可能会发生内存泄漏。

+0

但不是与片段相关的小部件?也许我错过了Fragments的工作原理。 – Raykud

+1

即使方向锁定,这可能会有问题。 Android为任何配置更改重新创建视图。而配置更改可以是显示旋转(通常情况下),语言更改,键盘连接/分离等。照顾屏幕旋转并不能解决整个问题。 – sstn

2

即使您使用setRetainInstance(true),当您旋转时(您将调用onDestroyView,然后onCreateView),您的片段仍然会重新创建它的视图。只要您不保留对过去onDestroyView的视图的引用,就不会有任何旧活动的泄漏。最好的方法是明确地清空onDestroyView中的引用,但onCreateView中的代码通常会覆盖这些引用。

网上有很多例子(包括一些官方的例子),其中人们使用单独的片段(无视图)来保留数据。假设我上面说的是正确的,那么这是不必要的(为了防止泄漏)。在很多情况下,如果您使用一个单独的片段,而这个片段的责任仅仅是处理数据而不担心UI,那么您可能会得到更简洁的代码/架构。

您可以通过using Eclipse MAT旋转后检查活动环境是否正在泄漏。