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

原创粉丝点击