android - 使用 RxJava2 改造响应代码
问题描述
所以我想在这个视频 droidcon NYC 2017 - Advanced Networking with RxJava + Retrofit中实现 API 响应的示例
这是我的代码:
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
永远不会被调用,所以我只能在第一次接受时访问代码方法,但在视频中,他发现了该Throwable
部分中的错误。所以,我无法弄清楚我做错了什么?也许我使用了错误的观察者?
解决方案
我想我明白了,如果我们用Observable<Response<Object>>
所有响应代码包装我们的响应对象,那么我们将在常规的接受方法中捕获,所以我们需要手动提取代码并进行检查。但是,如果我们保持Observable<Object>
, errorCode < 200 || errorCode > 400 将在 onError 方法中被捕获。
推荐阅读
- cplex - 跳过 OPL 模型中表中的缺失数据
- google-app-engine - (基本缩放)如果达到空闲超时,App Engine 会关闭仍在忙于处理请求的应用吗?
- salesforce - 通过数据验证从 Salesforce 下载 XLSX 文件
- css - React Material中InputBase中的边框颜色
- react-native - 如何在 Flatlist 中渲染全屏单项反应原生?
- javascript - 在 Firefox 78.2 上下载大文件时,ReadableStream 中途停止
- javascript - 将对象转换为数组和两个嵌套数组
- php - 如何修复错误 425 Can't open data connection for transfer of "/" php FTP - [已解决]
- javascript - 单击按钮时如何在特定数字上停止
- r - 如何使用我的值预测 GLM 的响应?