RxJava的学习旅程(一)

1.最近在群里听到最多的就是关于RxJava了,这个框架被很多人看好,是未来技术的主流。听了那么多关于RXJAVA的讨论,我早已按耐不住学习新技术的心了。虽然我还很菜,android基础知识都没玩透。android基本知识通过工作中的问题来学习,理解。课外时间研究下新技术。争取一年吧rxjava 玩好。


2.推荐文章https://mcxiaoke.gitbooks.io/rxdocs/content/Observables.html RxJava中文教程,这里面有很多名词运用的很到位,容易理解,介绍了RxJava的背景,由来,优点,解决什么问题等等这些引言。值得一看。

刚学习RxJava的时候,真的是搞不懂,建议先看看设计模式之观察者模式。我的博客中也有,举 的那个例子真心不错,可以看看。

今天主要记录的问题是。Observable(被观察者),Subscriber(观察者),OnSubscribe(订阅)。

先看一个demo:

这是一个被观察者创建的代码,通过静态方法create(onSubScribe)来实例化一个被观察者。

 Observable <String>myObservable=Observable.create(onSubscribe);


"订阅"对象的实例化:

 Observable.OnSubscribe<String>onSubscribe=new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                Toast.makeText(MainActivity.this, "hello Rxjava", Toast.LENGTH_SHORT).show();
            }
        };

观察者代码的实例化:

Subscriber<String> mySubscriber = new Subscriber<String>() {
            @Override
            public void onNext(String s) {
                Log.d("4577155", "Hello Rxjava");
            }

            @Override
            public void onCompleted() { }

            @Override
            public void onError(Throwable e) { }
        };

之后调用obervable.subscribe(subscriber);将观察者和被观察者绑定在一起。这就是rxjava的组成部位了。包括三大块:订阅,观察者,和被观察者。


观察者的实例化需要实现3个方法:分别是onnext,oncompleted,onerror方法。官方中文文档给的解释如下:

onNext(T item)Observable调用这个方法发射数据,方法的参数就是Observable发射的数据,这个方法可能会被调用多次,取决于你的实现。

onError(Exception ex):当Observable遇到错误或者无法返回期望的数据时会调用这个方法,这个调用会终止Observable,后续不会再调用onNext和onCompleted,onError方法的参数是抛出的异常。


onComplete:正常终止,如果没有遇到错误,Observable在最后一次调用onNext之后调用此方法。根据Observable协议的定义,onNext可能会被调用零次或者很多次,最后会有一次onCompleted或onError调用(不会同时),传递数据给onNext通常被称作发射,onCompleted和onError被称作通知。


rxjava 中文学习文档有几个概念很重要,值得我反复的阅读,揣摩。


1.观察者需要通过订阅与被观察者关联起来。

2.继续你的业务逻辑,等待方法返回结果,被观察者发射结果,观察者接收并且处理结果。


在刚开始学习的时候,我很困惑,不知道rxjava的代码风格为什么会是这样。不懂之间的调用关系。好在rxjava源码给写的通俗易懂,我这个菜鸟就能懂。接下来我来分析下源码。直接从下面这段代码开始查看源码:

obervable.subscribe(subscriber)


查看源码:看清楚subscribe(subscriber <T>subscriber)这个方法实际上是调用了。ObServable(被观察者)的静态方法subscribe().注意这个方法传递的参数是:观察者和被观察者。


我们继续查看Observable.subscribe(subscriber,this)这个方法的源代码:

其中核心代码就是这条了:


hook这个类是啥意思我也不清楚,不过不妨碍我们继续分析。hook.onSubscribestart(),这个方法 返还回来的是一个“订阅”对象,也就是observable.OnSubscribe。在通过查阅代码看看OnSubscribe里面咋写的。


这句话很有意思:当observable.subscribe(Subscriber)这个绑定方法被调用的时候,"订阅"对象将会调用它的call方法。注意call方法里面传递的参数 就是我们的“观察者”。也就是observable.subscribe(Subscriber)这个方法的参数。。。写在这里 我突然对onnext()方法的解释产生质疑。感觉应该是Subscriber调用onnext接收处理数据。不知道是不是翻译过来出问题了。

总结下:这个demo运行的流程:首先实例化Observable对象,onSubscribe对象(订阅)以及subscribe(观察者)对象。然后调用subscribe(),方法绑定观察者和被观察者。

绑定了之后,通过一些列的代码最终会执行到 onSubscribe.call(Subscriber)这个方法。在这个call方法里面我们可以调用观察者的onnext,oncompleted。onerror方法。


下面我来验证下是不是这么个流程:

看API我们知道 Observable的初始化,也可以通过如下的代码来创建一个Observable对象。

   Observable<String> myObservable = Observable.just("Hello, world!");
 Action1<String> action1=new Action1<String>() {
            @Override
            public void call(String s) {

            }
        };
        myObservable.subscribe(action1);
这个demo和上面给的那种方式的demo最终运行效果是一样的。

但是很明显Subscriber,明显被Action1对象取代了。

查看Action1接口发现:


这个Action1接口里面就是一个call方法。

我们在通过查看myObservable.subscriber(Action1).这个方法的源码。看下里面是怎么运作的。



相当于myObservable.subscriber(Action1).这条代码等价于myObservable.subscriber(Subscriber)这条代码。.

博客写在这里的时候,我自己就有一个疑问,根据我们上面的结论 必须先调用“订阅对象的call方法”,然后观察者在订阅对象的call方法中调用onnext方法。但是实际运行结果是能弹出一句话。。但是我并没有在代码中看到对Onsubscribe(订阅)的赋值啊,我的影像中这个对象为null。才对为毛还是可以呢。

最后我查看了observable.just创建方法。发现了


系统内部创建了一个OnSubscribe方法,并且在call里面执行了onnext方法,。最终发现通过Action的流程和我上面分析的也是吻合的。不过话说回来。这里的Action1的作用价值体现在哪呢。

最后根据变量命名分析:原来action在这里就是等与onNext的,观察者里面的onNext方法执行的是 Action1.call(T t)...系统那把这个Action1的变量命名为onNext.,说明Action1,对象通过call方法。来处理接收到的数据。


这些都是我今晚的理解,又不对的地方请指出。大概算是明白了Subscribe,observable,和onSubscribe之间 的关系。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值