我应该放开onStop()或onDestroy()中的视图引用等吗?

时间:2013-05-25 15:10:14

标签: android memory view android-activity

我应该放开我在onStop()onDestroy()中持有的观点和其他数据吗?

  • 如果我在onDestroy()中发布我的应用程序数据,它对android的内存不会很友好,我是否正确?因为我在onStop()之后仍然保持着几个观点。另外,它无法保证被调用,无论如何我的活动都会从内存中清除。
  • 如果我在onStop()中发布,我必须在setContentView()中添加onStart()等,但Bundle onCreate(Bundle) Note: Because the system retains your Activity instance in system memory when it is stopped, it's possible that you don't need to implement the onStop() and onRestart() (or even onStart() methods at all. {{1}}被交给了。

请注意,我有一个非常大的应用程序,它包含许多视图,其中大多数是自定义的,并且是通过代码而不是布局文件添加的。这主要是因为我必须创建一个自定义寻呼机来翻页,因为没有任何内置的视图可以满足我的目的(我已经尝试过......很难......)。

我已经阅读了所有相关的Android文档,但我仍然没有真正的线索,关于Android自我保存/重新创建的视图层次结构以及我自己必须做什么。或者当所有这些发生时,意味着当Android从内存中删除视图层次结构时。

更新问题:

Android文档说:{{1}}

如果可以坚持一切,那么当我的应用程序被停止时,我为什么要关心内存泄漏,如this文章所说的那样?如果它被破坏并重新创建,例如在屏幕旋转之后,我还是从头开始?

1 个答案:

答案 0 :(得分:2)

  1. 不,您不必放开onStop()onDestroy() 中的任何内容,如果您只在活动中保留它(非静态)字段)。当Android让我们开始你的活动时,剩下的东西会被自动丢弃(连同活动),因为没有办法从任何线程到达它(这是垃圾收集器的工作方式,它绝不是特别的或特定于活动)。

  2. 您引用的文章描述了一个问题,即对视图(或可绘制的,或者说广义的 - 活动上下文)的引用在创建它的活动中幸存。由于有一个参考指向已经死亡的活动,它变成了一个僵尸;更重要的是,它紧紧抓住所有领域,有效地将它们整合在一起。因此,如果你有一个视图或一个drawable并把它放在一个静态字段中(或者在你的活动对象中可能存在的任何其他地方),那么是的,你必须让它进入onStop()或{{1}相关活动。

  3. 如果Android破坏您的活动并放弃调用onDestroy(),则意味着整个过程被取消,这意味着无论如何都不会发生内存泄漏(它们是单个进程的本地)< / p>

  4. 奖金回答:

    1. 从XML文件中膨胀的视图所占用的内存与使用代码构建的内存完全相同。他们为什么要更重?

    2. 在活动被抛弃之前,
    3. (在评论之后更新),Android会遍历整个视图层次结构,并为每个视图提供将其状态(任何可分配数据)存储到一个包中的机会;在重新创建视图时,Android再次遍历树并返回数据。这就是为什么当您重新创建活动时,将保存视图的状态(焦点,位置,文本字段的内容等)。观察如何仅为具有id的元素保存状态(如果它们被充气或动态创建则无关紧要)。