【发布时间】: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