从服务器(Retrofit2,LiveData,RxJava2)接收到空响应时发生异常

时间:2019-04-24 15:56:56

标签: android retrofit2 android-architecture-components android-livedata

我苦苦挣扎的问题只有在我收到服务器的空响应时才会发生。如果响应为空,则它就像一个超级按钮。即使不适用于空响应,应用也不会崩溃!它只是跳过观察部分中的代码。此后没有更多说明,因此它只会永远显示加载圆圈。

我在项目中更改了一些代码,以查看其确切崩溃的原因并发现了这一点:

  

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);

我全神贯注于如何捕捉错误并对错误做出反应,以使观察功能不会崩溃。

0 个答案:

没有答案