【发布时间】:2019-02-04 09:40:43
【问题描述】:
我的活动中有此代码:
private val job = Job()
private val ioScope = CoroutineScope(Dispatchers.IO + job)
private val uiScope = CoroutineScope(Dispatchers.Main + job)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
ioScope.launch {
delay(3000L)
textView.text = "test1"
uiScope.launch {
textView.text = "test2"
}
}
}
如果我启动并等待 3 秒,应用程序将崩溃并显示 CalledFromWrongThreadException,这是可以预见的,因为我从 textView.text = "test1" 行中的后台线程更新 Ui。
但是如果我按下后退按钮,我会看到 onPause() 和 onDestroy() 将被调用,但后台线程中的 textView.text = "test1" 和 UI 线程中的 textView.text = "test1" 都会被调用,但无一例外。
为什么它没有崩溃,因为我更新了销毁活动的 UI?
这样写代码安全吗?例如,响应后进行网络调用和更新 UI(当 Activity 可能被销毁时),或者可能会出现一些问题?
【问题讨论】:
-
通常,当Activity被销毁时,我们会在
onDestroy()方法中调用uiScope.cancel()来停止协程的工作。 -
@Sergey 是的,我看到了,但是如果不打电话会怎样?
-
我猜协程会继续工作的。
标签: android kotlin kotlinx.coroutines