簡體   English   中英

在Activity.onDestroy()之后更新協程中的UI

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM