У меня есть этот код в моей деятельности:
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"
.
Но если я нажму кнопку назад, я вижу, что будут вызваны onPause () и onDestroy (), но будут вызваны обе строки textView.text = "test1"
в фоновом потоке и textView.text = "test1"
в потоке пользовательского интерфейса, но без исключения.
Почему не происходит сбой, потому что я обновляю пользовательский интерфейс при разрушенной активности?
Безопасно ли писать код таким способом?Например, выполнять сетевой вызов и обновлять пользовательский интерфейс после ответа (когда активность может быть уничтожена), или могут быть некоторые проблемы?