Не удается отловить сетевую ошибку при использовании сопрограммы, но ошибка может быть обнаружена в RxJava 2. Что я пропустил? - PullRequest
1 голос
/ 30 июня 2019

У меня есть следующий код, использующий Coroutine для выполнения сетевой выборки на фоне

    try {
        networkJob = CoroutineScope(Dispatchers.IO).launch {
            val result = fetchOnBackground(searchText)
            withContext(Dispatchers.Main) {
                showResult("Count is $result")
            }
        }
    } catch (exception: Throwable) {
        showResult(exception.localizedMessage)
    }

Когда сеть есть, все хорошо. Однако, когда хост неверен или отсутствует сеть, происходит сбой. catch не может поймать его.

Когда я пишу код с использованием RxJava

    disposable = Single.just(searchText)
        .map{fetchOnBackground(it)}
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(
            { showResult("Count is $it") },
            { showResult(it.localizedMessage) })

Все отлично работает. Даже в ситуации отсутствия сети ошибка перехватывается в обратном вызове ошибки.

Что я упустил в коде сопрограммы, что я не могу уловить ошибку на своем конце при использовании сопрограммы?

Примечание: при загрузке по сети используется OkHttp.

1 Ответ

0 голосов
/ 30 июня 2019

Похоже, мне нужно поместить try-catch в CouroutineScope(Dispatchers.IO).launch

    networkJob = CoroutineScope(Dispatchers.IO).launch {
        try {
            val result = fetchOnBackground(searchText)
            showResult("Count is $result")
        } catch (exception: Throwable) {
            showResult(exception.localizedMessage)
        }
    }

И я изменяю showResult на функцию приостановки, чтобы она могла включать withContext(Dispatchers.Main)

private suspend fun showResult(result: String) {
    withContext(Dispatchers.Main) {
        // Code that show the result
    }
}
...