4

我应该放弃我持有的视图和其他数据onStop()onDestroy()

  • 如果我在其中释放我的应用程序的数据,onDestroy()它对 android 的内存不会很友好,对吗?因为在 onStop() 之后我仍然坚持几个观点。另外,它不能保证被调用,而且我的 Activity 无论如何都会从内存中清除。
  • 如果我在 中释放它onStop(),我必须添加做我的setContentView()等,onStart()其中没有得到Bundle那个onCreate(Bundle)

请注意,我有一个非常大的应用程序,它由几十个视图组成,其中大部分是自定义的,由代码而不是布局文件添加。这主要是因为我必须创建一个自定义寻呼机来翻页,因为没有一个内置视图可以满足我的目的(我已经尝试过......努力......)。

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

更新问题:

android 文档是这样说的: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.

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

4

1 回答 1

4
  1. 不,您不必放手任何东西,onStop()或者onDestroy() 只在活动中(在其非静态字段中)持有它。当Android让我们离开你的活动时,你的其余东西会自动丢弃(连同活动一起),因为没有办法从任何线程访问它(这就是垃圾收集器的工作方式,它没有任何特别之处或特定于活动)。

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

  3. 如果 Android 销毁了你的 Activity 并放弃了调用onDestroy(),这意味着整个进程都被取消了,这意味着无论如何都不会发生内存泄漏(它们是单个进程的本地)

奖励答案:

  1. 从 XML 文件膨胀的视图占用的内存与内置代码的视图一样多。为什么它们应该更重?

  2. (更新,评论后)在一个 Activity 被丢弃之前,Android 会遍历其整个视图层次结构,并让每个视图有机会将其状态(任何可打包的数据)存储到一个包中;当重新创建视图时,Android 会再次遍历树并返回数据。这就是为什么当您重新创建活动时,会保存视图的状态(焦点、位置、文本字段的内容等)。观察状态是如何只为具有 id 的元素保存的(不管它们是膨胀的还是动态创建的)。

于 2013-05-25T16:05:32.110 回答