在异步调用完成之前按下后退按钮会发生什么?

时间:2015-11-04 19:08:06

标签: kotlin anko

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

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

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

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

如果用户在通话结束前按下后退按钮会怎样? IsFinishing将为true,我的视图模型实例将不再存在。异步会在返回时调用异常还是会优雅地死掉?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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