当Retrofit2+RxJava2遇到为null的返回结果

前言

更新RxJava2之后,就不能在onNext里面发送null值了。但是项目中有些接口,例如发送手机验证码的接口,后台返回过来data就为null。我将请求结果再次进行了一次包装,解决此问题,便在这记录下来。

正题

解决思路很简单,先将返回结果放入另一个对象中,让它可以成功发送出去,最后在回调方法中从此对象中去获取返回结果。

首先提供一个包装返回结果的类:Optional

public class Optional<M> {

    private final M optional; // 接收到的返回结果
    public Optional(@Nullable M optional) {
        this.optional = optional;
    }
    // 判断返回结果是否为null
    public boolean isEmpty() {
       return this.optional == null;
    }
    // 获取不能为null的返回结果,如果为null,直接抛异常,经过二次封装之后,这个异常最终可以在走向RxJava的onError()
    public M get() {
        if (optional == null) {
             throw new NoSuchElementException("No value present");
        }
        return optional;
    }
    // 获取可以为null的返回结果
    public M getIncludeNull() {
       return optional;
   }
}

现在已经可以将返回结果包装起来,然后就可以将这个包装后的对象发送出去,我的封装代码是:

/**
 * http请求结果处理方法
 *
 * @param <T>
 * @return
 */
public static <T> ObservableTransformer<RESTResult<T>, Optional<T>> handle_result() {
    return upstream -> upstream
            .flatMap(new Function<RESTResult<T>, ObservableSource<Optional<T>>>() {
                         @Override
                         public ObservableSource<Optional<T>> apply(@NonNull RESTResult<T> result) throws Exception {
                             if (result.status == RESTResult.SUCCESS) {
                                 // result.transform() 就是将返回结果进行包装
                                 return createHttpData(result.transform());
                             } else if (result.status == RESTResult.SIGN_OUT) {
                                // 登录失效逻辑处理
                                // ... 
                             } else {
                                 // 发送请求失败的信息
                                 String msg = result.message;
                                 return Observable.error(new RxException(msg));
                             }

                             return Observable.empty();
                         }
                     }
            );
}

private static <T> Observable<Optional<T>> createHttpData(Optional<T> t) {

    return Observable.create(e -> {
        try {
            e.onNext(t);
            e.onComplete();
        } catch (Exception exc) {
            e.onError(exc);  
        }
    });
}

最后只需要通过optional.get()或者optional.getIncludeNull()就可以得到请求结果。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,188评论 6 13
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,010评论 19 139
  • 前言 如果你对RxJava1.x还不是了解,可以参考下面文章。 1. RxJava使用介绍 【视频教程】2. Rx...
    jdsjlzx阅读 21,257评论 3 78
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,780评论 18 399
  • 转载自:https://xiaobailong24.me/2017/03/18/Android-RxJava2.x...
    Young1657阅读 2,046评论 1 9