所以我想像这个视频一样实现来自API的响应示例 droidcon NYC 2017 - Advanced Networking with RxJava + Retrofit
这是我的代码:
Presenter.java
compositeDisposable.add(RetrofitClient.createService(GetApi.class)
.getResponseFromServer(token)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<ResponseFromServer>() {
@Override
public void accept(ResponseFromServer responseFromServer) throws Exception {
mView.setResponseObject(responseFromServer);
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
throwable.printStackTrace();
if (throwable instanceof HttpException) {
int responseCode = ((HttpException) throwable).code();
}
}
}));
因此,在这里,当我从服务器收到一些4xx错误响应时,我可以转到Throwable
并获取响应代码,如果响应正常,则可以获取我的对象,并且一切都很好。
但是,在上面的视频示例中,那个人建议我将ResponseFromServer
用Response包裹起来,如下所示:
Single<Response<ResponseFromServer>> getResponseFromServer(@Header("X-Authorize") String token);
,因此我也可以访问响应代码,但是在那种情况下,我的Throwable
永远不会被调用,因此我只能在第一种accept方法中访问代码,但是在视频中他捕获了错误在Throwable
部分中。所以,我不能弄清楚我在做什么错?也许我使用了错误的观察者?
答案 0 :(得分:3)
我想我已经弄清楚了,如果我们用Observable<Response<Object>>
包装我们的响应对象,所有响应代码都将被常规的accept方法捕获,因此我们有点需要手动提取代码并进行检查。但是,如果我们保留Observable<Object>
,则errorCode <200 || errorCode> 400将被onError方法捕获。
答案 1 :(得分:2)
在这些情况下,如果来自服务器的响应为code < 200 || code >= 300
,则将调用onError()
。其他onNext()
会调用。
此外,如果您来自onNext()
的代码抛出任何异常,则会在onError()
中捕获