1

我有存储在应用程序类的数组列表中的视图模型。因此,即使活动因旋转而被破坏,它们的生命周期也会继续(但是一旦 isFinishing 为真,则视图模型实例将从列表中删除并不再存在)。

我也有视图模型使用的数据服务单例,这些视图模型也无限期地存在。因此,如果我使用 anko 异步块在我的视图模型中启动异步调用,即

async {
    val data = DataService.instance.getData()

    uiThread {
        if (data != null) {
           //do something
        }
    }
}

如果用户在通话完成之前按下返回按钮会发生什么?IsFinishing 将是真的,我的视图模型实例将不再存在。异步调用异常返回时会出现还是会优雅地死掉?

4

2 回答 2

1

如果底层活动/片段上下文已被垃圾收集,则 uiThread 调用中的代码将不会被执行。异步调用中的 uiThread 调用将保留WeakReference上下文,因此不会发生经常遇到的上下文内存泄漏。详情在这里

于 2015-11-04T19:43:24.913 回答
0

我想它会优雅地死去。您可以编写一个小型测试程序来调试行为。但是,我强烈建议保留异步任务的引用/指针,并在按下后退按钮时将其终止。如果您不需要结果/无法再处理结果,则无需让它在后台运行

于 2015-11-04T19:14:57.410 回答