RXJAVA方法调用浅析
来源:互联网 发布:painter中文版mac 编辑:程序博客网 时间:2024/05/18 00:13
根据所参考文章,写一写自己对RXjava要点的整理。
Subscriber 比 observer观察者 多出以下两个接口,其他他们都有可以被observable被观察者回调的方法 onNext 触发onCompleted作为结束标志 onCompleted 事件队列完结标志 和 onError 时间队列异常标志
onCompleted和 onError只能够触发一个
根据被观察者创建形式不同 事件队列分发也不一样
1、第一种 create方式
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();}
2、第二种from方式
String[] words = {"Hello", "Hi", "Aloha"};Observable observable = Observable.from(words);// 将会依次调用:// onNext("Hello");// onNext("Hi");// onNext("Aloha");// onCompleted();3、Observable observable = Observable.just("Hello", "Hi", "Aloha");// 将会依次调用:// onNext("Hello");// onNext("Hi");// onNext("Aloha");// onCompleted();
onStart() 就不适用了,因为它总是在 subscribe 所发生的线程被调用,而不能指定线程。要在指定的线程来做准备工作,可以使用 doOnSubscribe() 方法,具体可以在后面的文中看到。
观察者
unsubscribe(): 这是 Subscriber 所实现的另一个接口 Subscription 的方法,用于取消订阅。在这个方法被调用后,Subscriber将不再接收事件。一般在这个方法调用前,可以使用 isUnsubscribed() 先判断一下状态。 unsubscribe() 这个方法很重要,因为在 subscribe() 之后, Observable 会持有 Subscriber 的引用,这个引用如果不能及时被释放,将有内存泄露的风险。
释放被 被观察者引用的 接口的方法
Observable.subscribe(Subscriber) 进行提交订阅
不完整形式回调
Action0 对应无参数 无返回值的情况 如可以作为onCompleteAction
Action1 对应有参数 无返回值的情况 可以作为 onErrorAction 和onNextAction
Action2 和 Action3
observable.subscribe(onNextAction)
Observable.subscribe(onNextAction,onErrorAction)
Observable.subscribe(onNextAction,onErrorAction,onCompletedAction)
默认观察者和 被观察者 事件的发出 和 消费是同一个线程的
Scheduler调度器
进行切换线程
分为四种模式
1、schedulers.immediate() 直接当前线程运行,相对于不指定线程
2、schedulers.newThread() 启用新线程,并在新线程中执行操作
3、Schedulers.io() 执行io操作 如 读写文件、读写数据库、网络信息交互
4、Schedulers.computation() 执行cpu密集型计算,但不要放入io操作
5、AndroidSchedulers.mainThread() 操作在主线程中
指定事件发生线程 和 事件回调线程
.subscirbeOn(Schedulers.io());//执行subscribe发生在 io线程,,,被观察者运行线程
.observerOn(AndroidSchedulers.mainThread());//指定subscriber回调发生在主线程,即 观察者回调方法执行的线程
Lift实现机制 添加一层observable事件
将自身 转化为 旧的被观察者的 观察者 ,相当于添加了一层
.map(new Func1<String,Bitmap>(){ @overridePublic Bitmap call(String filePath){ Return getBitmapFromPath(filePath);}})
//进行 将 string 对象 转化为 bitmap对象变换
而flapMap则可以进行 一个 对象 转变为 多个对象的变换,,,相当于一个学生的课程 汇总到 observabel对象中,再执行分发
Observable.from(students) .flatMap(new Func1<Student, Observable<Course>>() { @Override public Observable<Course> call(Student student) {//通过 observable.from(对象数组)进行包裹分发对象 return Observable.from(student.getCourses()); } }) .subscribe(subscriber);
所以对于多级转换我们同样可以,进行 多级 Observable.from包裹变换
对于 多个 observable执行 相同的lift变换的情况
原来是这样的,多级lift变换比较繁琐,需要重复写
observable1
.lift1()
.lift2()
.lift3()
.lift4()
.subscribe(subscriber1);
observable2
.lift1()
.lift2()
.lift3()
.lift4()
.subscribe(subscriber2);
observable3
.lift1()
.lift2()
.lift3()
.lift4()
.subscribe(subscriber3);
observable4
.lift1()
.lift2()
.lift3()
.lift4()
.subscribe(subscriber1);
1、将多级lift变换汇总 应用于 observable
private Observable liftAll(Observable observable) {
return observable
.lift1()
.lift2()
.lift3()
.lift4();
}
…
liftAll(observable1).subscribe(subscriber1);
liftAll(observable2).subscribe(subscriber2);
liftAll(observable3).subscribe(subscriber3);
liftAll(observable4).subscribe(subscriber4);
2、将多级变换 用Transformer汇总应用于 observable变换
public class LiftAllTransformer implements Observable.Transformer<Integer, String> { @Override public Observable<String> call(Observable<Integer> observable) { return observable .lift1() .lift2() .lift3() .lift4(); }}...Transformer liftAll = new LiftAllTransformer();observable1.compose(liftAll).subscribe(subscriber1);observable2.compose(liftAll).subscribe(subscriber2);observable3.compose(liftAll).subscribe(subscriber3);observable4.compose(liftAll).subscribe(subscriber4);
subscribeOn 影响本级实现线程
observeOn 在本级执行完成,影响下一级开始实现线程
默认情况下, doOnSubscribe() 执行在 subscribe() 发生的线程;而如果在 doOnSubscribe() 之后有 subscribeOn() 的话,它将执行在离它最近的 subscribeOn() 所指定的线程。
示例代码:
RxBinding 是 Jake Wharton 的一个开源库,它提供了一套在 Android 平台上的基于 RxJava 的 Binding API。所谓 Binding,就是类似设置 OnClickListener 、设置 TextWatcher 这样的注册绑定对象的 API。
举个设置点击监听的例子。使用 RxBinding ,可以把事件监听用这样的方法来设置:
Button button = ...;RxView.clickEvents(button) // 以 Observable 形式来反馈点击事件 .subscribe(new Action1<ViewClickEvent>() { @Override public void call(ViewClickEvent event) { // Click handling } });
看起来除了形式变了没什么区别,实质上也是这样。甚至如果你看一下它的源码,你会发现它连实现都没什么惊喜:它的内部是直接用一个包裹着的 setOnClickListener() 来实现的。然而,仅仅这一个形式的改变,却恰好就是 RxBinding 的目的:扩展性。通过 RxBinding 把点击监听转换成 Observable 之后,就有了对它进行扩展的可能。扩展的方式有很多,根据需求而定。一个例子是前面提到过的 throttleFirst() ,用于去抖动,也就是消除手抖导致的快速连环点击:
RxView.clickEvents(button) .throttleFirst(500, TimeUnit.MILLISECONDS) .subscribe(clickAction);
如果想对 RxBinding 有更多了解,可以去它的 GitHub 项目 下面看看。
参考链接
http://gank.io/post/560e15be2dca930e00da1083
- RXJAVA方法调用浅析
- 浅析RXjava
- Rxjava浅析
- 浅析RxJava核心
- RxJava源码浅析
- Android使用RxJava浅析
- 浅析Rxjava(一)
- 浅析rxjava(二)lift
- RxJava原理浅析
- Android rxjava用法浅析
- C# 跨线程调用TextBox方法浅析
- C# 跨线程调用TextBox方法浅析
- ASP.NET调用存储过程两种方法浅析
- 类继承中构造方法的调用原理浅析
- javascript的面向对象方法调用中的优先级浅析
- 浅析@Deprecated,调用方法时出现横线划掉样式
- 非常火的retrofit+Rxjava浅析
- Rxjava源码浅析(一)观察者模式
- 浙工大姗姗杯round1 C
- 内核移植中的RTC问题
- Django 基础开发
- USACO oct. 09 Watering Hole
- Java基本语法_01
- RXJAVA方法调用浅析
- GCC和G++区别
- 《编程之美》学而思
- 序列化和反序列化
- zookeeper介绍及集群安装(一)
- Unit 6
- 欢迎使用CSDN-markdown编辑器
- day02逆置/反转单链表+查找单链表的倒数第k个节点+实现一个Add函数不用四则运算
- 交叉排序