【问题标题】:Android - is onDestroy supposed to destroy the activity, its variables and free up memoryAndroid - 是 onDestroy 应该销毁活动,它的变量并释放内存
【发布时间】:2011-05-26 14:36:43
【问题描述】:

我的代码中有一个错误,让我觉得我没有完全理解 Android 生命周期。是的,我已经阅读了所有文档并查看了图表,但它们似乎只讨论何时保存数据,何时活动可能失去焦点或被杀死。但是,我的问题是,如果我不需要保存状态,变量及其存储的值会怎样?我预计它们会被销毁,但我的代码中的一个错误似乎表明并非如此。

就我而言,这就是发生的事情。我有一个启动自定义视图的活动(没有 xml,我只是在自定义视图的屏幕上绘制位图)。我目前在我的活动中拥有的唯一变量只是我的视图变量:GameView gameView;

现在,在我看来,我声明了几个位图、简单的 int 和 float 变量来处理绘图和触摸事件,并且我有一个包含小位图、每个对象的坐标和其他一些东西的对象数组。我的类中这个对象的一个​​变量是一个静态变量,它表示它们是多少个对象的当前计数。我是这样做的,所以对象的实例化使它跟踪它们的人对象,而不是在对象的类之外跟踪它。

我希望静态变量在所有对象中保持相同的值,但我也希望一旦为该 Activity 调用 onDestroyed,该变量将与该 Activity 视图的所有其他变量和对象一起被销毁。然而,这似乎并没有发生。当此 Activity 再次启动时,此静态变量仍包含上次运行时的先前值 - 即使调用了 onDestroyed。

现在我的问题不是如何解决这个问题(我可以编写不同的代码来修复这个错误),但我想了解为什么这个静态变量会发生这种情况,因为它对整个应用程序不是全局的,它只存在于该活动的视图中?此外,这让我想知道该视图中的其余变量 - 它们是否被破坏并且它们的内存被释放,或者至少它们的值在下次调用活动时不再可用,或者我是否需要自己执行此操作 - 即使我不需要保存任何这些状态数据?

感谢您对此的任何见解。

【问题讨论】:

    标签: android memory lifecycle object-lifetime ondestroy


    【解决方案1】:

    onDestroy 是一个实例方法,它释放的任何内存(或允许垃圾收集器释放)都将属于相应的实例。活动不是单例的;一个 Activity 可以有多个实例。

    静态变量是类变量,可以访问该类的所有实例。它们是在加载类时初始化的,而不是在创建类的每个实例时。

    请参阅Understanding Instance and Class members 了解更多信息。摘录:

    有时,您希望有变量 是所有对象共有的。这 是用静态完成的 修饰符。具有静态的字段 他们声明中的修饰符是 称为静态字段或类 变量。它们与 类,而不是与任何 目的。类的每个实例 共享一个类变量,它在 内存中的一个固定位置。任何 对象可以改变类的值 变量,但类变量也可以 被操纵而不创建 类的实例。

    【讨论】:

    • 谢谢,我知道静态变量是所有对象的相同内存位置,但我不知道“类变量也可以在不创建类实例的情况下进行操作。”。这可以解释为什么当对象被销毁时为什么这个值会挂起。顺便说一句,当我说 onDestroy 时,我还没有创建它或除 onCreate 之外的任何生命周期方法。这就是为什么当我点击后退按钮时,预计与该 Activity 实例关联的所有数据都已被删除。但现在我明白了为什么这个变量会一直存在。谢谢。
    • 问题就在这里。静态变量不是与类的任何实例关联的数据。
    • 如果我的 Activity 持有另一个类对象的引用(简单类不是 Activity)并且是实例成员,那么 onDestroy() 方法是否会为我清除它,或者我需要显式清除它(设置为空)?
    猜你喜欢
    • 2019-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 2011-05-26
    • 2023-01-27
    • 2012-01-14
    相关资源
    最近更新 更多