更新UI在协程Activity.onDestroy后()

问题描述 投票:0回答:1

我在我的活动这样的代码:

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,或者可能会有一些问题?

android kotlin kotlinx.coroutines
1个回答
3
投票

你基本上由不取消协程造成的(临时)内存泄漏。更新活动被破坏后视图实际上不会造成任何异常被抛出;相反,标准的变化不会反映在任何UI。你在更新已被丢弃,但只保存在内存中的活动值,由于你的协同程序保持对它的引用。

作为@Sergey提到,你应该job.cancel() onDestroy()

© www.soinside.com 2019 - 2024. All rights reserved.