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

Kotlin 在异步调用完成之前按下后退按钮会发生什么情况?,kotlin,anko,Kotlin,Anko,我的视图模型存储在应用程序类的数组列表中。因此,即使活动由于旋转而被破坏,它们的生命周期也会继续(但是一旦isFinishing为true,视图模型实例就会从列表中删除并停止存在) 我还有数据服务单例,视图模型也会无限期地使用它们。因此,如果我在视图模型中使用anko async块启动一个异步调用 async { val data = DataService.instance.getData() uiThread { if (data != null) {

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

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

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

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

如果用户在通话结束前按下后退按钮,会发生什么情况?IsFinishing将为true,并且我的视图模型实例将不再存在。异步调用异常会在返回时发生还是会正常终止

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

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

所以我猜这意味着异步{ui{}}应该总是在活动和/或片段上编码?如果在调用返回之前发生旋转,uiThread会执行吗?是的,除非异步执行的结果可以独立于活动/片段保存,否则使用uiThread。当设备旋转时,将重新创建活动,以便uiThread中的代码不会执行。请注意,如果在片段中执行此操作,则仍需要检查片段是否实际附加,即如果
activity!=空
。这是因为片段可以被分离,但不能被垃圾收集。