В каком потоке выполняется subscribe() в RxJava?
У меня есть метод getText(), который получает из сети текст. Его нужно вставить в TextView.
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity);
Observable.fromCallable(() -> getText())
.subscribeOn(Schedulers.io())
.subscribe(integer -> textView.setText(integer + ""));
}
Загрузку текста я выполняю асинхронно. Как я понимаю должна быть ошибка, что я могу менять интерфейс только в UI потоке. Но ошибки нет. Почему так, если я указываю Schedulers.io()?
UPD Исключения не будет даже если укажу observeOn(Schedulers.io()) перед subscribe().
Ответы (1 шт):
Я думаю, что проблема вашего кейса в том, что RX Java по каким-то причинам не успевает переключаться с UI потока на рабочий и по этому вы не падаете с ошибкой. Если же запустить это в дебагере с точкой остановы в subscribe() вы получите желаемую ошибку.
Более того если в цепочку добавить delay:
Observable.fromArray(1, 2, 3)
.delay(2, TimeUnit.SECONDS)
.subscribeOn(Schedulers.io())
.subscribe(
{ integer ->
view.findViewById<TextView>(R.id.textview_first).text = integer.toString()
},
{ error ->
Toast.makeText(requireContext(), error.message, Toast.LENGTH_LONG).show()
})
То вы так же получите ошибку о том, что нельзя обновлять View не на UI потоке.