Kotlin 在异步调用完成之前按下后退按钮会发生什么情况?
我的视图模型存储在应用程序类的数组列表中。因此,即使活动由于旋转而被破坏,它们的生命周期也会继续(但是一旦isFinishing为true,视图模型实例就会从列表中删除并停止存在) 我还有数据服务单例,视图模型也会无限期地使用它们。因此,如果我在视图模型中使用anko async块启动一个异步调用Kotlin 在异步调用完成之前按下后退按钮会发生什么情况?,kotlin,anko,Kotlin,Anko,我的视图模型存储在应用程序类的数组列表中。因此,即使活动由于旋转而被破坏,它们的生命周期也会继续(但是一旦isFinishing为true,视图模型实例就会从列表中删除并停止存在) 我还有数据服务单例,视图模型也会无限期地使用它们。因此,如果我在视图模型中使用anko async块启动一个异步调用 async { val data = DataService.instance.getData() uiThread { if (data != null) {
async {
val data = DataService.instance.getData()
uiThread {
if (data != null) {
//do something
}
}
}
如果用户在通话结束前按下后退按钮,会发生什么情况?IsFinishing将为true,并且我的视图模型实例将不再存在。异步调用异常会在返回时发生还是会正常终止 我想它会优雅地死去。您可以编写一个小型测试程序,在其中调试行为。但是,我强烈建议保留一个指向异步任务的引用/指针,并在按下后退按钮时将其删除。如果不需要结果/无法再正确处理结果,则无需让它在后台运行如果底层活动/片段上下文已被垃圾收集,则不会执行uiThread调用中的代码。异步调用中的uiThread调用将保存对上下文的
WeakReference
,因此不会发生经常遇到的上下文内存泄漏。详细信息。所以我猜这意味着异步{ui{}}应该总是在活动和/或片段上编码?如果在调用返回之前发生旋转,uiThread会执行吗?是的,除非异步执行的结果可以独立于活动/片段保存,否则使用uiThread。当设备旋转时,将重新创建活动,以便uiThread中的代码不会执行。请注意,如果在片段中执行此操作,则仍需要检查片段是否实际附加,即如果activity!=空
。这是因为片段可以被分离,但不能被垃圾收集。