我苦苦挣扎的问题只有在我收到服务器的空响应时才会发生。如果响应不为空,则它就像一个超级按钮。即使不适用于空响应,应用也不会崩溃!它只是跳过观察部分中的代码。此后没有更多说明,因此它只会永远显示加载圆圈。
我在项目中更改了一些代码,以查看其确切崩溃的原因并发现了这一点:
E / MainApplication:无法交付的致命错误
io.reactivex.exceptions.CompositeException:发生2个异常
这2个如下:
ComposedException 1: android.os.NetworkOnMainThreadException
ComposedException 2: java.lang.NullPointerException:println需要一条消息
这是我用来进行API调用的代码(由于隐私原因,某些标识符已更改)。我尝试使用RxJava的onError,onErrorReturn和try + catch,但是没有任何异常捕获。我读到一些有关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);
我全神贯注于如何捕捉错误并对错误做出反应,以使观察功能不会崩溃。