【问题标题】:setRetainInstance fragment with UI Android带有 UI Android 的 setRetainInstance 片段
【发布时间】:2012-05-24 13:13:39
【问题描述】:

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

【问题讨论】:

    标签: android android-asynctask android-fragments


    【解决方案1】:

    即使您使用setRetainInstance(true),您的 Fragment 仍会在您旋转时重新创建其视图(您将收到对onDestroyView 的调用,然后是onCreateView)。只要您不保留对过去 onDestroyView 的视图的引用,就不会出现旧 Activity 的任何泄漏。最好的方法是将onDestroyView 中的引用显式置空,但您在onCreateView 中的代码通常会覆盖这些引用。

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

    您可以在旋转using Eclipse MAT 后查看是否泄漏了 Activity 上下文。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 但不是与片段关联的小部件吗?也许我误解了 Fragments 的工作原理。
      • 即使方向被锁定,这也可能有问题。 Android 会为任何配置更改重新创建视图。而配置更改可能是显示旋转(通常情况下)、语言更改、键盘附加/分离等。照顾屏幕旋转并不能解决整个问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多