【问题标题】:Background Activity's local objects being garbage collected by Xamarin Android背景 Activity 的本地对象被 Xamarin Android 垃圾收集
【发布时间】:2013-10-15 05:01:19
【问题描述】:

我的应用在一堆活动中导航(在同一个任务中)

A -> B -> C

继续前进是可以的,但我注意到在我弹回 B(从 C)或 A(从 B)后,该 Activity 中的所有 CLR 对象都是空的。这包括本地字段和事件处理程序。

我的猜测是,Android 会在内部序列化 Activity 堆栈(忽略 CLR 字段),从而导致 CLR GC 收集这些 A​​ctivity 的对象。这显然是不希望的,肯定有办法防止这种情况发生。

有没有人设法在 Activity 进入后台然后被恢复后保留它的 CLR 对象?

【问题讨论】:

    标签: android android-activity garbage-collection xamarin


    【解决方案1】:

    你是对的。当您在活动 C 上时,A 和 B 都处于“已停止”状态,因此有资格被清理(移至“已销毁”状态,然后进行垃圾收集)。看起来文档中的相关文章在这里:

    http://developer.android.com/training/basics/activity-lifecycle/recreating.html

    非常基本的想法:您覆盖onSaveInstanceState,Android 会在适当的时候调用它。然后它将传递给您的 onCreate() 方法,以便您可以在重新创建活动时恢复它。

    编辑:当然还有其他选择。当您的状态信息很庞大时,您尤其应该寻找替代方案,因为上面的方法(反)序列化您的状态,这可能会变得很昂贵。

    就个人而言,我倾向于将我需要的信息保存在数据库中,并在onCreate() 甚至onStart() 中进行检查(当我需要对其他活动中发生的更改做出反应时,可能会在此活动期间发生)还在记忆中)。您还可以将所需的信息保存到文件或任何其他持久存储中。不同之处在于,您需要负责了解何时应该恢复状态,以及何时应该重新开始。

    请注意,将状态保存在静态变量中也不起作用。静态变量往往比活动的实例变量持久,但它们可以在没有通知的情况下被擦除,例如当你接到电话时。

    【讨论】:

    • 无法序列化瞬态 UI 对象。与 iOS 相比,Android 的设计非常糟糕。
    • 正确,您不应该尝试保存实际的 UI 对象。相反,保存它们代表的值。我不懂 iOS 编程,但我知道要花很长时间才能习惯 Android 中的所有注意事项,所以如果 iOS 更简单,我不会感到惊讶。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多