Исключение при получении пустого ответа от сервера (Retrofit2, LiveData, RxJava2) - PullRequest
1 голос
/ 24 апреля 2019

Проблема, с которой я сталкиваюсь, возникает только тогда, когда я получаю пустой ответ от сервера. Если ответ не пуст, он работает как брелок. Даже если это не работает с пустым ответом, приложение не падает! Он просто пропускает код в части наблюдения. После этого нет дальнейших инструкций, поэтому он всегда показывает круг загрузки.

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

E / MainApplication: недопустимая фатальная ошибка

io.reactivex.exceptions.CompositeException: произошло 2 исключения

Эти 2 следующие:

ComposedException 1: android.os.NetworkOnMainThreadException

ComposedException 2: java.lang.NullPointerException: println необходимо сообщение

Вот код, который я использую для выполнения API-вызова (некоторые идентификаторы изменены из-за конфиденциальности). Я попытался использовать onError, onErrorReturn и try + catch в RxJava, но ничего не ловит исключения. Я читал что-то о LiveData, не доставляющем исключения, но я не настолько знаком с ним.

В представлении:

liveData = viewModel.getDataFromApi(displayedCategory!!.id, getString(R.string.lang_code))
liveData?.observe(this, Observer<Array<Data>> {...}

В моей ViewModel:

fun getDataFromApi(categoryId: Int, language: String): LiveData<Array<Data>> {
        return LiveDataReactiveStreams
            .fromPublisher(
                repository.getDataFromApi(categoryId, language)
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread()))
    }

В моем репозитории:

fun getDataFromApi(categoryId: Int, language: String): Flowable<Array<Data>> {
        return rfService.getDataOfCategory(categoryId, language)
            .doOnNext {
                Log.d("Repository", "Fetching ${it.size} data from API")
                //adding the language to the question for DB calls
                for (element in it) {
                    element.language = language
                }
                insertQuestionsInDb(it)
            }
            .onErrorReturnItem(emptyArray())
    }

Сервис дооснащения выглядит следующим образом:

@GET("data/categories/{category_id}/questions/{lang}")
    Flowable<Data[]> getQuestionsOfCategory(@Path("category_id") int categoryId, @Path("lang") String lang);

Я в полной растерянности, как отловить ошибку и отреагировать на нее, чтобы функция наблюдения не вылетала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...