• RXJava之扩展的观察者模式(二)


    阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680

    1. RxJava 的观察者模式解读

    RxJava 有四个基本概念:

    Observable (可观察者,即被观察者)
    Observer (观察者)
    subscribe (订阅)
    事件
    Observable 和 Observer 通过 subscribe() 方法实现订阅关系,从而 Observable 可以在需要的时候发出事件来通知 Observer

    Android 常见的观察者模式:

     
    19956127-3ff77eead73816b7.png
     

    与传统观察者模式不同, RxJava 的事件回调方法除了普通事件 onNext() (相当于 onClick() / onEvent())之外,还定义了两个特殊的事件:onCompleted() 和 onError()

    onCompleted():事件队列完结。RxJava 不仅把每个事件单独处理,还会把它们看做一个队列。RxJava 规定,当不会再有新的 onNext() 发出时,需要触发 onCompleted() 方法作为标志

    onError():事件队列异常。在事件处理过程中出异常时,onError() 会被触发,同时队列自动终止,不允许再有事件发出

    在一个正确运行的事件序列中, onCompleted() 和 onError() 有且只有一个,并且是事件序列中的最后一个。需要注意的是,onCompleted() 和 onError() 二者也是互斥的,即在队列中调用了其中一个,就不应该再调用另一个。

    2. 扩展的观察者模式

    Observable 和 Observer 通过 subscribe() 方法实现订阅关系
    RxJava 的事件回调方法 onNext() 、onCompleted() 和 onError()
    如果一个Observable 中没有任何的 Observer ,那么这个Observable是不会发出任何事件的
    第三点说明:

    在RxJava 中 Obseravable 有两种启动方式:热启动 和 冷启动

    热启动 Obseravable在任何时候都会发送消息,即使没有任何观察者监听它
    冷启动 Obseravable只有在至少有一个监听者时才会发送消息
    热启动平时用不到,所以我们工作中用到的都是冷启动。

     
    19956127-52a45486d7ebb4a8.png
     

    3. RxJava 的实现和使用

    RxJava的实现主要有如下三步:

    第一步:创建观察者Observer。

    Observer 即观察者,它决定事件触发的时候将有怎样的行为。注意:Observer是 个接口。
    第二步:创建被观察者Observable。

    第三步:Subscribe(订阅)(被观察者Observable订阅观察者Observer,注意:不同于普通观察者,这里是被观察者订阅观察者)。

    创建 Observable 和 Observer 之后,再 subscribe() 法将它们联结起来,整条链子就可以 作 。代码形式很简单:

     
    19956127-04bf72c9c946303a.png
     

    所以贴出之前实现过的代码:

     
    19956127-592537ced833533f.png
     


    编译运行:

     
    19956127-d279792fe1fc8bff.png
     

    这时制造一个异常再看下输出:

     
    19956127-1b165ff5516ba3b5.png
     


    编译运行:

     
    19956127-0f786b8b645ceb34.png
     


    从打印中可以看出,onError()和onCompleted()是不共戴天滴。

    除 Observer 接口之外,RxJava 还内置了一个实现 Observer 的抽象类:Subscriber(发 [səb'skraɪbɚ])。 Subscriber 对 Observer 接口进行了一些扩展,但他们的基本使用方式是完全一样的:

     
    19956127-7540b07ba86eb94b.png
     

    编译运行:

     
    19956127-23ec2a957ef0d2b2.png
     


    那既然观察者有两个:Observer和Subscriber,那这两者有啥区别呢?当然是有区别滴,不过在未来会进行学习,这里先有个印象。

    另外在Rxjava中,如果对于事件回调中,只想要onNext()方法,onError()和onCompleted()都不需要,有木有简化方案呢?当然有:

     
    19956127-838aa1ffd210a9ef.png
     


    而之前我们创建Observable是通过它:

     
    19956127-a9068fdaa44ec2ad.png
     


    所以简化版采用just操作符来,如下:

     
    19956127-f40644e0c888ed7a.png
     


    编译运行:

     
    19956127-5269cf5a98fe5413.png
     


    下面改用Action1类来达到我们所要的需求:

     
    19956127-8d0db748adcaa129.png
     


    编译运行:

     
    19956127-b5bffbf8ddd7b41d.png
     


    但是,官方并不推荐使用该类来简化操作,因为Action1并不支持背压(BackPressure),而产生的大至原因是由于Rxjava的事件产生过快时导致。
    参考https://www.cnblogs.com/webor2006/p/7531713.html
    https://blog.csdn.net/u011033906/article/details/58614549

    阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680

  • 相关阅读:
    codevs 3641 上帝选人
    codevs 1966 乘法游戏
    codevs 1345 饥饿的奶牛
    codevs 1962 马棚问题--序列型DP
    codevs 1959 拔河比赛--判断背包内刚好装满n/2个物品
    codevs 1297 硬币
    [转载]矩阵取数游戏
    101.金明的预算方案(分组背包)
    105.(并查集结合绝对值最小的01背包)选学霸
    POJ 2528 Mayor's posters(线段树)
  • 原文地址:https://www.cnblogs.com/Android-Alvin/p/12102922.html
Copyright © 2020-2023  润新知