我有视图模型存储在应用程序类的数组列表中。因此,即使活动因旋转而被破坏,它们的生命周期仍在继续(但是一旦isFinishing为真,则视图模型实例将从列表中删除并停止存在)。
我还有视图模型使用的数据服务单例,它们也无限期地存在。因此,如果我使用anko异步块在我的视图模型中启动异步调用,即
async {
val data = DataService.instance.getData()
uiThread {
if (data != null) {
//do something
}
}
}
如果用户在通话结束前按下后退按钮会怎样? IsFinishing将为true,我的视图模型实例将不再存在。异步会在返回时调用异常还是会优雅地死掉?
答案 0 :(得分:1)
如果底层活动/片段上下文已被垃圾收集,则uiThread调用中的代码将无法执行。异步调用中的uiThread调用将保持WeakReference
上下文,因此经常遇到的上下文内存泄漏不会发生。详情here。
答案 1 :(得分:0)
我想它会优雅地死去。您可以编写一个小的测试程序来调试行为。但是,我强烈建议保留一个指向异步任务的引用/指针,并在按下后退按钮时将其终止。如果您不需要结果/无法再处理结果,则无需让它在后台运行