Rxjava+Retrofit嵌套处理请求,并优雅的处理异常

2023-11-18

前情提示:

本文只是一个例子,不做过多讲解,入门知识推荐参考

仍物线大神讲解的Rxjava如何优雅的处理服务器异常,本文没有对Rxjava进行任何封装,也没有使用retrolambda,因为对于初学者来说,看起来费(不)劲(会),而且也没必要。


正文

 今天要写的例子是模拟 一个实际的登录请求。

1. 用户登录

2. 根据用户登录的返回结果(Status code),判断是否继续执行 查询用户


开始

1. 首先定义Services接口

public interface IUserServices {

    @POST("user/login")
    @FormUrlEncoded
    Observable<ResponseBody> login(@Field("acount")String acount, @Field("password") String password);

    @GET("user/{userid}")
    Observable<JsonResponse<User>> getUserById(@Path("userid")String userid);

}


2. 配置我们的OkHttpClient

    OkHttpClient client = new OkHttpClient.Builder()
                .addInterceptor(new LogingInterceptor())
                .retryOnConnectionFailure(true)
                .addInterceptor(responselog)
                .addNetworkInterceptor(new TokenInterceptor())
                .build();
配置Retrofit

    mRetrofit = new Retrofit.Builder()
                .baseUrl(ConstandUtils.SERVICE_BASEURL)
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create(gson))
                .client(client)
                .build();


3. 自定义返回对象

public class JsonResponse<T> {

    private int status;  //状态码  status_code

    private T data;  

    public int getStatus_code() {
        return status;
    }

    public void setStatus_code(int status_code) {
        this.status = status_code;
    }


    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}


关于这个对象,我也是被折磨了很久之后,才封装的一个 响应实体,起初我的Services接口中的接口是这么写的:

 @GET("user/{userid}")
 Observable<User> getUserById(@Path("userid")String userid);
可是当我发现转换的实体对象的值全为null的时候:

{id='null', acount='null', name='null', email='null', emailConfirmed='null', isLockedOut='null', enterpriseId='null', regAddress='null', mobilPhone='null', phone='null', description='null', creatDate='null', tokenTime='null', accessToken='null', headUrl=null, activiti=0, nickname='null', number=0}
我注意了下 服务器所返回的json字符串:

{"status":0,"data":{"id":null,"acount":"xxxxxxxxx","name":null,"email":null,"emailConfirmed":null,"isLocked....
,而我的User这个对象:

public class User implements Parcelable {
    
        private String id;
        private String acount;
        private String name;
        private String email;
        private String emailConfirmed;
        private String isLockedOut;
        private String enterpriseId;
        private String regAddress;
        private String mobilPhone;
      
,后端给我返回的是一个格式的json,所以我定义了JsonResponse


4. 开始请求

  mUserService=mRetrofit.create(IUserServices.class);
mIUserServices
                .login(username,pwd)  //登录请求,传入用户名和密码,返回Observable<ResponseBody> 对象
                .subscribeOn(Schedulers.io())  //事件产生在io线程
                .flatMap(new Func1<ResponseBody, Observable<JsonResponse<User>>>() {
                    @Override
                    public Observable<JsonResponse<User>> call(ResponseBody responseBody) {
                        String userid = parse_Login(responseBody);    //解析这个Response(相当于在解析 json),得到userid
                        if("error".equals(userid)) {    //status code >0 返回error,表示请求有误
                            return Observable.error(new Throwable("信息错误"));//随便返回了一个错误信息
                        }
                        return mIUserServices.getUserById(userid); //如果有,证明请求成功,那么去查询用户
                    }
                })
                .flatMap(new Func1<JsonResponse<User>, Observable<User>>() {
                    @Override
                    public Observable<User> call(JsonResponse<User> userJsonResponse) {
                        return Observable.just(userJsonResponse.getData()); //将这个user发送出去
                    }
                })
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<User>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {
                        mPresenter.onError(e.getMessage());
                    }

                    @Override
                    public void onNext(User user) {

                        System.out.println("--->user"+user);
                    }
                });


重点内容

  1. 当使用map时候,你就不能使用 Observable.error()了,它会继续往下执行,从而无法中断这次链式。你需要使用 throw new 一个异常
  2. 当使用flatmap时候,你要使用Observable.error()


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rxjava+Retrofit嵌套处理请求,并优雅的处理异常 的相关文章

  • 使用 RxJava 处理长时间运行的任务

    我正在尝试迁移AsyncTask向服务器发送消息 使用 RxJava 粗略地说 该任务执行以下操作 1 创建一条将要发送的消息 保存到数据库 2 向用户显示消息 状态 正在发送 3 向服务器发送消息 代码片段如下 4 将消息标记为已发送或失
  • 使用 RXJava 进行缓存处理

    我正在尝试使用 rxJava 实现此工作流程 但我确定我是否误用或做错了事情 用户要求登录 如果登录结果在缓存中可用 则 发出 缓存的登录结果 否则 如果一切成功 则实际执行对 Web 服务的请求并缓存结果 如果发生错误 最多重试 3 次
  • RxJava + Retrofit -> BaseObservable 用于 API 调用以进行集中响应处理

    我是 RxJava 新手 所以如果这听起来太新手 请原谅我 截至目前 我有一个实现 Retofit 回调的抽象 CallbackClass 在那里 我捕获了回调的 onResponse 和 onError 方法 并在最终转发到自定义实现的方
  • RxJava 出错后如何继续流式传输项目?

    我是 RxJava 新手 我遇到了以下问题 假设我有一系列项目 并且其中一个项目传播错误 我想忽略它并继续处理其他项目 我有以下片段 Observable from Arrays asList 1 2 3 map x gt if x equ
  • RxJava Observable.fromEmitter 奇怪的背压行为

    我一直在利用Observable fromEmitter 作为一个绝佳的替代品Observable create 我最近遇到了一些奇怪的行为 但我不太明白为什么会出现这种情况 我真的很感谢对背压和调度程序有一定了解的人来看看这个 publi
  • RxJava 2.x 中带有背压的 PublishSubject

    我目前正在为我当前的项目选择 RxJava 1 x 或 2 x 我基本上需要一个PublishSubject采用背压策略onBackpressureLatest 我想选择 RxJava 2 x 但我不太清楚如何将反压策略应用于Publish
  • Rx:组合 ThrottleFirst 和 Sample 运算符

    给定一个源可观察 S 我如何要求 RxJava Rx 生成可观察 D 即 立即从 S 发出第一项 在发射每个项目之后和发射下一个项目 L 之前等待至少 T 秒 其中 L 是 S 在等待期间发射的最后一个项目 如果 S 在等待时间 T 内没有
  • 何时使用 doOnTerminate 与 doOnUnsubscribe?

    当有人订阅我的可观察对象时 我需要收到通知 我还需要收到通知 可观察对象已出错或已完成 所以我想我应该使用doOnSubscribe 注册观察者订阅时要采取的操作 可观察的 and doOnTerminate 注册一个 Observable
  • 如何使用rxjava获取retrofit 2.0中的请求url?

    我正在尝试升级到 Retrofit 2 0 并在我的 android 项目中添加 RxJava 我正在进行 api 调用 并希望检索 url 及其以及 sqlite 中的响应数据作为缓存 Observable
  • Rx 2 Android 对于 api 调用,Single 或 Observable 哪个更好?

    当我们使用 Retrofit2 通过 Rx 进行 API Rest 调用时 最好的使用方法是什么 单一还是可观察 public interface ApiService Single
  • RXJava - 制作一个可暂停的可观察对象(例如带有缓冲区和窗口)

    我想创建执行以下操作的可观察对象 在暂停时缓冲所有项目 立即发出项目 同时它们不会暂停 暂停 恢复触发器必须来自另一个可观察的 必须保存它才能供不在主线程上运行的可观察对象使用 并且必须保存更改主线程的暂停 恢复状态 我想用一个Behavi
  • 如何处理 RxJava 中 Observable 中的 map() 中的异常

    我想做这个 Observable just bitmap map new Func1
  • 用于改造响应代码处理的自定义 rx Func1

    我是 rxjava 的新手 所以请不要严格 我请求虱子下一个 Observable
  • RxJava + 改造,获取列表并为每个项目添加额外信息

    我正在玩 RXJava 在 Android 中进行改造 我正在努力完成以下任务 我需要定期轮询一个给我 Observable gt 的调用 从这里我可以做到 一旦我得到这个列表 我想在每个交付中迭代并调用另一个方法来给我预计到达时间 所以只
  • 如何使用 Retrofit 和 RxJava/RxAndroid 处理响应错误?

    我无法弄清楚如何使用改造和 RxAndroid 处理响应错误 如果存在网络错误等 则会调用 onError 但我需要能够获取响应以检查是否存在身份验证错误 相反 我得到的是一个带有空字符串的令牌 但我找不到原因 解决这个问题的最佳方法是什么
  • 基于内容的 RxJava Observable 缓冲区

    我使用 vertX 和 RxJava 启动了一个项目 但遇到了一个问题 但没有找到解决方案 我有一个 Observable 它为传入通信发出 WebSocketFrame 每个 WebSocketFrame 由有效负载 ByteBuffer
  • Single.zip - 如何捕获失败的呼叫并继续其余的网络呼叫?

    我正在进行 5 个并行网络调用 模拟其中 4 个成功 其中 1 个失败 失败的调用使整个Single zip 失败 即使其他 4 个网络调用成功 我也无法获得它们的结果 如何处理单个失败的网络调用的错误Single zip 并获得成功者的结
  • RxJava、Proguard 和 sun.misc.Unsafe

    我有以下问题RxJava 1 1 0 使用时Proguard 我没有更改 RxJava 版本或其 pro文件 但更新后OkHttp我无法编译使用Proguard因为我有关于sun misc Unsafe不在场 rxJava pro keep
  • 仅对布尔可观察值中的错误值进行反跳

    我有一个布尔可观察值 通过观察者 启动和停止 Android 服务 当 true 被传递时 服务必须立即启动 当 false 被传递时 我想将其反跳 以防很快出现 true 以避免不必要的 和破坏性的 服务停止和启动 是否有可以做到这一点的
  • 如何使用 Retrofit 2 和 RxJava 处理分页

    我知道如何处理 Retrofit 响应 但在使用 rx java 处理来自 REST API 的分页时遇到问题 背景 我使用的其余 api 为我提供了以下响应 并在标题中提供了下一页的链接 HTTP 200 OK Allow GET HEA

随机推荐