项目实训(五)Rxjava 2.0 学习笔记

我感觉Rxjava像是一条流水线,一块原料到来经过层层加工最后交给订阅者,当然不处理直接交给订阅者也可以。

从基本设计(Rx1.0)来看,Observable有一个内部类实例OnSubscribe,当Observable调用subscribe时会调用这个OnSubscribe的call。这就是全部。一般来说会在call里调用Subscriber的方法将信息传递过去。由此基本逻辑,又延伸封装出各种操作符和骚操作。

线程切换和各种数据流的加工可以说是设计的核心了,实际上他们都是用lift实现的:

// 注意:这不是 lift() 的源码,而是将源码中与性能、兼容性、扩展性有关的代码剔除后的核心代码。
// 如果需要看源码,可以去 RxJava 的 GitHub 仓库下载。
public <R> Observable<R> lift(Operator<? extends R, ? super T> operator) {
    return Observable.create(new OnSubscribe<R>() {
        @Override
        public void call(Subscriber subscriber) {
            Subscriber newSubscriber = operator.call(subscriber);
            newSubscriber.onStart();
            onSubscribe.call(newSubscriber);
        }
    });
}

这个方法本质上是根据传入的operator创建了新的Observable。然后我们可以想象一下,在一个链式调用中可以有很多次调用这个方法,最终的一个Observable调用subscribe,然后调用OnSubscribe的call,然后到上图所示代码里。对call传入的Subscriber进行处理生成新的Subscriber交给他上一级的Observable,最终交到第一个Observable,然后这个开头开始发送数据,数据流经过一次又一次处理最终又交给真正subscribe的那个Subscriber。

1.subscribeOn在向上一级传递消息的时候切换线程,所以只有第一次调用有效。

observeOn在调用subscriber的方法(向下走)的时候切换线程,可以多次调用,控制下游线程。

 

2.线程调度分为默认的当前线程,主线程,新线程,IO线程和计算线程。IO线程用于IO等阻塞较长时间的,计算线程则用于高密度计算类的。注意主线程是AndroidSchedulers.mainThread。interval默认在子线程。

2.取消订阅:

Observable持有Observer的引用,所以有必要及时取消订阅避免内存泄漏。

subscribe方法可以接收Observer和Consumer,其中因为Consumer是只有一个处理数据的简单订阅者,所以返回值为Disposable,可以直接调用这个的dispose取消订阅。而参数为Observer的订阅无返回值,这个Disposable要到Observer的OnSubscribe里获取。

 

例子1,10秒验证码:

首先有一个全局变量Disposable disposable,

          disposable = Observable.interval(1,TimeUnit.SECONDS)
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<Long>() {
                    @Override
                    public void accept(Long aLong) throws Exception {
                        tv.setText("还剩"+(10-aLong)+"秒");
                        if (aLong>=10){
                            disposable.dispose();
                        }
                    }
                });

内部达到十秒的时候接触订阅,外部活动销毁的时候也可以用这个Disposable接触订阅。

参考:http://gank.io/post/560e15be2dca930e00da1083#toc_15

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章