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

Android 我应该放弃onStop()或onDestroy()中的视图引用等吗?,android,memory,view,android-activity,Android,Memory,View,Android Activity,我是否应该放弃在onStop()或onDestroy()中保留的视图和其他数据 如果我在onDestroy()中发布我的应用程序的数据,它对android的内存友好性会很差,对吗?因为在onStop()之后,我仍然保留着几个视图。另外,它不能保证被调用,我的活动也会从内存中清除 如果我在onStop()中释放它,我必须在onStart()中添加do mysetContentView()等,它不会得到onCreate(Bundle)的Bundle 请注意,我有一个非常大的应用程序,它由几十个视

我是否应该放弃在
onStop()
onDestroy()中保留的视图和其他数据

  • 如果我在
    onDestroy()
    中发布我的应用程序的数据,它对android的内存友好性会很差,对吗?因为在onStop()之后,我仍然保留着几个视图。另外,它不能保证被调用,我的活动也会从内存中清除
  • 如果我在
    onStop()
    中释放它,我必须在
    onStart()
    中添加do my
    setContentView()
    等,它不会得到
    onCreate(Bundle)
    Bundle
请注意,我有一个非常大的应用程序,它由几十个视图组成,大多数视图都是自定义的,并且是通过代码而不是布局文件添加的。这主要是因为我必须创建一个自定义的寻呼机来浏览页面,因为没有一个内置的视图可以满足我的目的(我已经努力了)

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

更新问题:

android文档这样说:
注意:由于系统在停止时将活动实例保留在系统内存中,因此您可能不需要实现onStop()和onRestart()(甚至不需要实现onStart()方法。

若可以保留所有内容,那个么当我的应用程序像文章所说的那个样被停止时,我为什么要关心内存泄漏呢?若它被破坏并重新创建,比如在屏幕旋转之后,我还是从头开始呢

  • 不,你不必放弃
    onStop()
    onDestroy()
    中的任何东西,如果你只在活动中(在非静态字段中)保留它。当Android放弃你的活动时,你的其他东西会自动扔掉(与活动一起),因为无法从任何线程访问它(垃圾收集器就是这样工作的,它对活动没有任何特殊或特定的方式)

  • 您所指的文章描述了一个问题,其中对视图(或可绘制的,或者广义上说是活动上下文)的引用在创建它的活动中幸存下来。由于有一个引用指向已经死亡的活动,它就变成了僵尸;而且,它会附着到所有字段,实际上也会将它们僵尸化。因此,如果您有一个视图或可绘制视图,并将其放在一个静态字段中(或任何其他可能在活动对象中幸存下来的位置),那么是的,您必须让它进入相关活动的
    onStop()
    onDestroy()

  • 如果Android破坏了您的活动并放弃调用
    onDestroy()
    ,这意味着整个进程都已停止,这意味着无论如何都不会发生内存泄漏(它们是单个进程的本地)

  • 奖励答案:

  • 从XML文件中膨胀的视图所占用的内存与内置代码中的视图所占用的内存完全相同。为什么它们要更重

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


  • 即使您放弃引用,标记和扫描仍然是gc的工作。gc开始释放内存。假设您有一个位图。您可以在onPause()中调用bitmap.recycle()。但释放内存仍然是gc的工作。要获取数据,请使用Activity方法
    getIntent()< /代码>检索当前意图,同样地,在其上传递任何额外的内容。考虑一种情况,每个活动都有一个背景。您从第一活动导航到第二。第一活动被暂停。但未被破坏。您的第一个活动是在后台。在这种情况下,可以在OnReSuMe()中加载图像,并在OnPAUSEE()中解除绑定或循环。。当gc启动时,释放其内存。在这种情况下,它可以工作注意:操作系统只有在需要回收内存时才会销毁后台活动。您链接到的文章通过保留对视图的静态引用来阻止在活动之间使用视图。这是不好的,因为它会阻止创建视图的活动ng收集。一个好的一般规则是永远不要保留对视图、活动或上下文的静态引用。我有一个建议:从这个问题的框架来看,我听起来好像你认为活动是一个应用程序。它不是。如果你认为你的活动是一个servlet,那么它就不包含任何应用程序数据(一个服务或内容提供商就是这样做的)整个问题都没有意义。我不是说它们更重,只是我不知道Android如何/是否在onStop()/onPause()之后引用视图层次结构来实现一些内存魔法。不幸的是,我似乎无法使用onStop()或onDestroy(),因为在调用之前有5秒的延迟。请看我的问题:@fdreger-你能告诉我如何在onDestroy()中释放视图吗?@Rat-a-tat-a-tatratotouille:不,这取决于你如何控制它们。除非你做了一些不明智的事情,让它们留下来,否则不释放任何内容是可以的。