RxJava2 进阶之Observable 的种类及其对应的场景

59 篇文章 0 订阅
33 篇文章 1 订阅

前言

这篇文章主要讲述一件事情,如何正确的定义我们程序中的 Observable,
下文中所有说到的信号,和我们常说的 RxJava发射的元素、Item、Error、Complete是同一类东西,但是我习惯叫它信号,在ObjectC中的Rac中也称之为信号

Observable 的种类

在 RxJava2 中,官方给我们定义了五种形式的[Observable]在这里插入图片描述

  • Observable 表示可以发射0-N个Item信号,当收到Complete信号或者Error信号结束,所以这里就有一种可能是成功发射了若干个然后失败,特别注意这点
  • Flowable 从之前的 Observable 中分离出来的,有Observable 的特性的同时支持背压(后续文章会说,或者自行搜索)
  • Single 表示只会发送一个信号或者一个Error信号就结束的Observable
  • Maybe 表示只会收到一个Complete信号或者一个Item信号或者Error信号就结束的Observable
  • Completeable 表示只会收到一个Complete信号或者Error信号就结束的Observable

真实代码中如何辨别使用哪种 Observable

其实上述几种情况都是 RxJava帮我们定义的一些常用的类型,下面就随便说几种普通代码和上面定义相符的情况

  • 迭代集合中的元素 --> Observable

由于出发点是你想要处理集合中的 Item,那么针对的就是 集合中的 Item,而集合有多个 Item

// 就变成了一个可以发射 N 个 item 的 Observable 了
Observable observable = Observable.fromIterable(Iterable source);
// 相似方法针对数组的也有 
Observable observable = Observable.fromArray(T... items);
  • Single --> Observable

有时候我们拿到一个 Single,但是Single发射是一个集合,而我们后续想拿到集合中的元素进行操作,所以就有了下面的情况

List<String> list = new ArrayList<>();
list.add("123123");

Observable<String> observable = Single.just(list)
        .flatMapObservable(new Function<List<String>, ObservableSource<String>>() {
            @Override
            public ObservableSource<String> apply(List<String> strings) throws Exception {
                    return Observable.fromIterable(strings);
            }
        });

  • 网络请求 --> Single

其实我们定义 Retrofit Api 的方法的时候,通常很多人继承了 RxJava1 的习惯,或者压根不知道还有 Single,又或者根本分不清用哪个.

其实很简单,你发起一个网络请求,你只可能会受到一个 response 或者一个错误(可能是超时、服务器报错…),那么这种情况不就是上述 RxJava2 中帮我们定义的场景吗?它就是一个 Single

  • 普通方法 --> Single
// 从数据库拿所有的订单对象
public List<Order> getAllOrderFromDb() {
    // .....
}

这个也是需要使用 Single 去改为下面的代码,这里有少数人就有问题了,说这里不是一个 List对象吗?它里面不是有多个元素吗?不应该使用 Observable 或者 Flowable 吗?

注意上面的代码的方法是只会返回一个对象,不管这个对象是什么,它就只可能只有一个,不能根据对象里面还有元素去判别,如果非要用 Observable 的场景也不是没有,看下面的示例

// 从数据库拿所有的订单对象
public Single<List<Order>> getAllOrderFromDb() {
    // .....
}

如果一定要和 Observable 相符的描述的话,下面的代码非常的符合.
因为我们它那里有可能会得到 0-N个 Item 元素,正好符合 Observable 的描述

// 从数据库拿所有的订单对象
public void getAllOrderFromDb(@Nonnull Callback<Order> callback) {
    callback.accept(order1);
    callback.accept(order2);
    .....
}

还有一个情况
我们用过 RxBinding 的人应该知道,它可以把一个控件的点击事件给转化为 Observable

Observable<Object> o = RxView.click(bt_commit);

为什么这里就是一个 Observable,一定还是要牢记 Observable 的定义,因为点击事件是用户点击触发的,根本不知道用户会点击多少次,所以这正好也符合

  • Completeable
// 取消订单
public void cancelOrder(String orderId){
    // 去取消订单
}

这情况下没有返回值,方法调用成功了就表示成功结束了,如果出现异常就抛出一个异常,这种正好符合 Completeable ,类似的事情还有很多,切记 Completeable 的定义

  • FlowableMaybe

Flowable 其实多用于背压,其他的使用场景 Observable 足以,所以平常很少用到,后续会有单独的篇幅来介绍 Flowable 的,它的整体设计也和 Observable 有所差别

Maybe 这个操作符我平常真的没用到过,等我用到了再来更新一下文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值