【问题标题】:Xamarin Android Activities and Disposing of DisposablesXamarin Android 活动和一次性用品的处置
【发布时间】:2018-01-04 07:44:57
【问题描述】:

我发现虽然有很多关于 Xamarin Android 的教程,但似乎没有太多关于如何处理资源的内容。更具体地说,当它们被丢弃时。

例如,在一个活动的 OnCreate 处理程序中,我进行了多个 Rx 订阅,每个订阅都返回一个 IDisposable。我试图在各种其他处理程序(例如 OnDestroy)中处理这些处理程序,但这些处理程序从未被调用。但订阅似乎堆积如山,因为每次导航到活动时都会运行 OnCreate。

除了那些订阅之外,还有我分配给类级变量(字段)的所有 UI 控件(TextViews、Buttons 等)。而那些也实现了IDisposable

据我所知,我到处都是内存泄漏。

在任何地方都有这方面的指导吗?

【问题讨论】:

  • 我建议您查看 Activity 生命周期流程图:developer.android.com/guide/components/activities/… OnResumeOnPause 覆盖是您的朋友 ;-)
  • @SushiHangover 我来看看。我想知道如果 OnPause 被调用,为什么 OnCreate 会被调用。我原以为 OnResume 意味着 OnCreate 不需要再次运行。但我会看看那些处理程序。
  • OnCreate 将被称为 if Activity 需要创建,如果它而不是仅在当前 Activity 上调用 Finish 来创建一个新实例返回导航堆栈中的最后一个?
  • @SushiHangover 我没有打电话给 Finish。当我再次回家时,我将不得不检查我的代码,但我想我正在调用 StartActivity 以导航回原始 Activity。我可以从您的评论中看出我应该将其从堆栈中弹出以返回。
  • 是的,通过StartActivity 创建一个新实例并不是通常您想要做的。在某些情况下,这是您想要的,但它已添加到堆栈中。或者添加活动是singleTop,以便向现有实例发送一个新的Intent(在OnNewIntent覆盖中读取该意图)等等......但通常你只会Finish你的活动打开并返回到最后一个..

标签: xamarin xamarin.android


【解决方案1】:

@SushiHangover 是正确的(感谢 Sushi)。 OnPauseOnResume 是我所关注的事件。我也遇到了一些挑战,当我单击自定义“返回开始”按钮时,我需要直接返回开始屏幕(沿途跳过中间屏幕)。

这样做的方法是在启动主屏幕活动时使用ClearTopActivityFlag (Android.Content.ActivityFlags.ClearTop)。可以在此处查看原始 Android 代码版本https://stackoverflow.com/a/5794572/540156

当你这样做时,你可以清理那些在弹出时从后台堆栈弹出的活动(在 OnDestroy 处理程序中,来自回忆)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多