【问题标题】:Can a coroutine scope leak an activity/fragment?协程范围可以泄漏活动/片段吗?
【发布时间】:2020-03-13 20:17:06
【问题描述】:

当用户退出活动时,我需要将EditText 数据保存到文件中。我知道我有很多选择,具体取决于为我保存数据的重要性。但是对于这种特殊情况,我可以承受失去它,所以最好的价格是可以的。

我们也许可以创建一个后台服务,将其与主机活动完全分离。但是,我也在考虑创建一个可能比活动寿命更长的协程范围(即:单例 NonUIScope)并像这样调用块;

override fun onSaveInstanceState(bundle: ...) {
    ...
    mInput = et.text.toString()
}

override fun onDestroy() {
    NonUIScope.launch {
         Downloader.saveData(mInput)
    }
}

当然,实现相同目标可能会略有不同,例如,使用onSavedInstanceSate() 而不是将其写入文件,但我的观点是:如果我使用我创建的ApplicationScope,可以我可能会泄漏活动(即使协程中没有 UI 引用)?

【问题讨论】:

  • saveData()是你Activity的实例方法吗?如果是这样,我相信只要该方法仍在运行,活动就会保留在内存中(您可以使用 Android Studio 中的内存分析器对此进行测试)。除了潜在的泄漏之外,用户可能会在保存数据之前杀死应用程序。更好的方法是使用 WorkManager,它对这些情况很方便,而且设置起来也很容易。
  • 好点。但是让我们假设 lambda 不会关闭任何与活动相关的事情。其次,据我所知,“WorkManager”并不是为立即行动而设计的。
  • 即使saveData() 没有使用 Activity 中的任何东西,它是一个实例方法这一事实意味着需要有一个 Activity 实例运行才能运行该方法。但是,如果 saveData() 是静态的,我认为它不会阻止 Activity 被垃圾收集。关于 workManager 不是为即时操作而设计的,我很想知道你在哪里读到这篇文章,我已经在生产应用程序中使用它来进行即时和定期工作,它工作得很好。
  • 我试图更清楚地表明saveData 确实与Activity 无关(参见代码)。关于WorkManager不太适合“立即行动”:请看developer.android.com/topic/libraries/architecture/workmanager

标签: android memory-leaks kotlin-coroutines


【解决方案1】:

只要NonUIScope 与您的活动没有任何关系,并且 Downloader 类不包含您的活动实例,它就不会泄露您的活动。

例如如果你使用GlobalScope,启动的协程的生命周期只受整个应用程序的生命周期限制,不受你的活动限制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多