Rx含义是响应式编程,其本质就是观察者模式,以观察者(Observer)和订阅者(Subscriber)为基础的异步响应方式。
Observables发出一系列事件,Subscribers处理这些事件。这里的事件可以是任何你感兴趣的东西(触摸事件,异步接口调用返回的数据等)
Rx模式以及优点
使用观察者模式
1、创建:Rx可以方便的创建事件流和数据流
2、组合:Rx使用查询式的操作符和变换数据流
3、监听:Rx可以订阅任何可观察的数据流并执行操作
简化代码
1、Rx的操作符可以将复杂的难题简化为很少的几行代码
2、异步错误处理,传统的try/catch没法处理异步计算,Rx提供了合适的错误处理机制
3、轻松使用并发,Rx的Observables和Schedulers让开发者可以摆脱底层的线程同步和各种并发问题
RxJava
观察者模式面向的需求是:A 对象(观察者)对 B 对象(被观察者)的某种变化高度敏感,需要在 B 变化的一瞬间做出反应。
程序的观察者模式和这种真正的『观察』略有不同,观察者不需要时刻盯着被观察者(例如 A 不需要每过 2ms 就检查一次 B 的状
态),而是采用注册(Register)或者称为订阅(Subscribe)的方式,告诉被观察者:我需要你的某某状态,你要在它变化的时候通知
我。 Android 开发中一个比较典型的例子是点击监听器OnClickListener
。对设置 OnClickListener
来说, View
是被观察者,
OnClickListener
是观察者,二者通过setOnClickListener()
方法达成订阅关系。订阅之后用户点击按钮的瞬间,Android
Framework 就会将点击事件发送给已经注册的OnClickListener
。采取这样被动的观察方式,既省去了反复检索状态的资源消耗,
也能够得到最高的反馈速度。当然,这也得益于我们可以随意定制自己程序中的观察者和被观察者,而警察叔叔明显无法要求小偷
『你在作案的时候务必通知我』。
RxJava四个基本概念:Observable(被观察者)、Observer(观察者)、subscribe(订阅)、事件。
Observable和Observer通过subscribe()方法实现订阅关系,从而Observable可以在需要的时候发出事件来通知Observer。
配置:
compile 'io.reactivex:rxjava:1.2.0' compile 'io.reactivex:rxandroid:1.2.1'DEMO:
/** * 被观察者接口 */ public interface Watched { /** * 添加观察者 * @param watcher */ void addWatcher(Watcher watcher); /** * 删除观察者 * @param watcher */ void removeWatcher(Watcher watcher); /** * 提醒所有的观察者 * @param str */ void notifyWatchers(String str); }
/** * 抽象主题角色 * Created by Administrator on 2017/11/3. */ /** * 被观察者实现类 */ public class CreateWatched implements Watched { //保存添加的观察者对象 private List<Watcher> list = new ArrayList<>(); @Override public void addWatcher(Watcher watcher) { list.add(watcher); } @Override public void removeWatcher(Watcher watcher) { list.remove(watcher); } @Override public void notifyWatchers(String str) { //此处就是,当被观察者发生变化时,通知观察者进行响应 for (Watcher watcher : list) { watcher.update(str); } } }
/** * 观察者接口 */ public interface Watcher { /** * 接收被观察者变化的通知 * * @param str */ void update(String str); }
/** * 观察者实现类 */ public class CreateWatcher implements Watcher { @Override public void update(String str) { System.out.println(str); } }
/** * 测试 * 这样把观察者订阅给被观察者,当被观察者发生变化时,依次通知与它绑定的观察者 * Created by Administrator on 2017/11/3. */ public class TestObservable { public static void main(String[] args) { Watched xiaoming = new CreateWatched();// 被观察者 Watcher watcher = new CreateWatcher();// 观察者 Watcher watcher1 = new CreateWatcher(); Watcher watcher2 = new CreateWatcher(); xiaoming.addWatcher(watcher); xiaoming.addWatcher(watcher1); xiaoming.addWatcher(watcher2); xiaoming.removeWatcher(watcher1); xiaoming.notifyWatchers("我要偷东西了"); } }