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

What happens when back button is pressed before asynchronous call is completed?

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

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

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

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

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

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

如果底层 activity/fragment 上下文已被垃圾回收,则 uiThread 调用中的代码将不会执行。异步调用中的 uiThread 调用会将 WeakReference 保存到上下文,因此不会发生经常遇到的上下文内存泄漏。详情 here.