Проблема, с которой я сталкиваюсь, возникает только тогда, когда я получаю пустой ответ от сервера. Если ответ не пуст, он работает как брелок. Даже если это не работает с пустым ответом, приложение не падает! Он просто пропускает код в части наблюдения. После этого нет дальнейших инструкций, поэтому он всегда показывает круг загрузки.
Я немного изменил код в своем проекте, чтобы понять, почему именно он падает, и нашел это:
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);
Я в полной растерянности, как отловить ошибку и отреагировать на нее, чтобы функция наблюдения не вылетала.