RxJava笔记
来源:互联网 发布:淘宝卖家登陆页面 编辑:程序博客网 时间:2024/05/21 19:48
RxJava 观察者模式
四个基本概念:
Observable : 被观察者
Observer : 观察者
subscribe : 订阅
事件
订阅关系:
Observable <—-subscribe—-> Observer,Observable发出时间通知Observer。
三个事件:
· onCompleted():RxJava将事件放进队列,当没有新的onNext()事件时会触发onCompleted();
· onError():事件队列出现异常时,onError()被触发,同时队列终止,不允许再有事件发出;
onCompleted和onError只有一个,在队列的最后一个调用。
实现步骤:
Ⅰ创建Observer
Observer 即观察者,它决定事件触发的时候将有怎样的行为。
Observer接口:
Observer<String>observer = new Observer<String>(){ //@Override回掉方法 onNext(String){} onCompleted(){} onError(Throwable e){}}
实现Observer接口的抽象类Subscriber(进行了扩展):
Subseriber<String> sub = new Subseriber<String>(){ onNext(String){} onCompleter(){} onError(Throwable e){}}
实质上Oberver会被先转换成一个Subseriber再使用。
两者区别:
Subscriber新增的两个方法:
1.onStart():在事件还未发送前调用,做准备工作。不能对线程有要求,在subscirbe发生的线程调用,不能指定线程。(如果要指定线程可以用duOnSubscirbe()方法);
2.unsubscirbe():用于取消订阅。调用前可用isUnsubscribed() 判断状态。subscribe() 之后, Observable 会持有 Subscriber 的引用,不释放可能会内存泄漏;
Ⅱ创建Observable
Observable 即被观察者,它决定什么时候触发事件以及触发怎样的事件。
使用create()创建Observable:
Observable observable = Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { subscriber.onNext("Hello"); subscriber.onNext("Hi"); subscriber.onNext("Aloha"); subscriber.onCompleted(); }});
Ⅲ订阅事件
创建了 Observable 和 Observer 之后,再用 subscribe() 方法将它们联结起来,整条链子就可以工作了。
observable.subscribe(observer);// 或者:observable.subscribe(subscriber);
涉及到的类:
1.OnSubscribe类
OnSubscribe{ //call方法 public void call(Subscriber<? super Object> subscriber){}}
2.Subscriber类
Subscriber{ onStart(){} onNext(){} onComplete(){} onError(){} unsubscribe(){}}
3.Observable类
Observable{ //订阅的方法: subscribe(Subscriber sub){}}
关系:
Observable observable = Observable.create(OnSubscribe onSubscribe);
onSubscribe会被存在observable中;
当observable被订阅的时候,onSubscribe的call方法被调用:
observable.subscribe(subscriber);subscribe方法内部实现:public Subscription subscribe(Subscriber subscriber) { subscriber.onStart(); onSubscribe.call(subscriber); return subscriber;}
线程控制 Scheduler
Schedulers.immediate(): 直接在当前线程运行,相当于不指定线程。这是默认的 Scheduler。
Schedulers.newThread(): 总是启用新线程,并在新线程执行操作。
Schedulers.io(): I/O 操作(读写文件、读写数据库、网络信息交互等)所使用的 Scheduler。行为模式和 newThread() 差不多,区别在于 io() 的内部实现是是用一个无数量上限的线程池,可以重用空闲的线程,因此多数情况下 io() 比 newThread() 更有效率。不要把计算工作放在 io() 中,可以避免创建不必要的线程。
Schedulers.computation(): 计算所使用的 Scheduler。这个计算指的是 CPU 密集型计算,即不会被 I/O 等操作限制性能的操作,例如图形的计算。这个 Scheduler 使用的固定的线程池,大小为 CPU 核数。不要把 I/O 操作放在 computation() 中,否则 I/O 操作的等待时间会浪费 CPU。
另外, Android 还有一个专用的 AndroidSchedulers.mainThread(),它指定的操作将在 Android 主线程运行。
切换线程的方法:
- subscribeOn(): 指定 subscribe() 所发生的线程,即 Observable.OnSubscribe 被激活时所处的线程。或者叫做事件产生的线程。
- observeOn(): 指定 Subscriber 所运行在的线程。或者叫做事件消费的线程。
observeOn()可以多次调用切换不同的线程,subscribeOb()被多次调用时只进行在第一次调用的线程。
在流程执行前指定准备工作的线程的方法:doOnSubscribe
虽然超过一个的 subscribeOn() 对事件处理的流程没有影响,但在流程之前却是可以利用的。
Subscriber 的 onStart() 可以用作流程开始前的初始化。然而 onStart() 由于在 subscribe() 发生时就被调用了,因此不能指定线程,而是只能执行在 subscribe() 被调用时的线程。这就导致如果 onStart() 中含有对线程有要求的代码(例如在界面上显示一个 ProgressBar,这必须在主线程执行),将会有线程非法的风险,因为有时你无法预测 subscribe() 将会在什么线程执行。
而与 Subscriber.onStart() 相对应的,有一个方法 Observable.doOnSubscribe() 。它和 Subscriber.onStart() 同样是在 subscribe() 调用后而且在事件发送前执行,但区别在于它可以指定线程。默认情况下, doOnSubscribe() 执行在 subscribe() 发生的线程;而如果在 doOnSubscribe() 之后有 subscribeOn() 的话,它将执行在离它最近的 subscribeOn() 所指定的线程。
Observable.create(onSubscribe) .subscribeOn(Schedulers.io()) .doOnSubscribe(new Action0() { @Override public void call() { progressBar.setVisibility(View.VISIBLE); // 需要在主线程执行 } }) .subscribeOn(AndroidSchedulers.mainThread()) // 指定主线程 .observeOn(AndroidSchedulers.mainThread()) .subscribe(subscriber);
- RxJava笔记
- Rxjava笔记
- RxJava笔记
- RxJava笔记
- rxJava笔记
- RxJava笔记
- RxJava笔记
- RxJava笔记
- RxJava笔记
- [RxJava笔记]RxJava操作符
- RxJava学习笔记
- RxJava学习笔记
- RxJava的学习笔记
- RxJava 学习笔记一
- RxJava 学习笔记二
- RxJava学习笔记1
- RxJAVA学习笔记(一)
- RxJava学习笔记2
- activiti 网关
- 网络号,IP,子网掩码之间的关系
- 问题解决“WIN7系统 .CHM文件打开后显示html帮助执行程序停止工作”
- CSS设置Alpha值
- codevs1036 商务旅行 lcs倍增
- RxJava笔记
- Android自定义组合控件以及使用方法_1
- hbase学习01-集群搭建
- 插入排序(java实现)
- 图解 Android 事件分发机制
- BZOJ P1179[Apio2009]Atm
- Ubuntu下使用SVN
- Linux命令大全(八)--Linux vi编辑器常见命令的使用
- S-DES加密