[英]Update UI in coroutine after Activity.onDestroy()
我的活動中包含以下代碼:
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
,這是可以預見的,因為我從CalledFromWrongThreadException
textView.text = "test1"
行中的后台線程更新了Ui。
但是,如果我按后退按鈕我看到的onPause()和的onDestroy()被調用,但兩條線textView.text = "test1"
在后台線程和textView.text = "test1"
在UI線程會被調用,但沒有例外。
為什么它不崩潰,導致我在被破壞的活動上更新UI?
這樣編寫代碼是否安全? 例如,響應后(活動可能被銷毀時)進行網絡調用並更新UI,還是可能存在一些問題?
您基本上是在不取消協程的情況下導致(臨時)內存泄漏。 在Activity被銷毀后更新View實際上不會引發任何異常; 相反,更改不會反映在任何用戶界面中。 您正在更新已被丟棄的活動中的值,但是由於協程保留對它的引用,因此僅保留在內存中。
正如@Sergey提到的,您應該在onDestroy()
job.cancel()
onDestroy()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.