Retrofit和Rxjava结合实践(二)--Rxjava快速理解

上一篇我们介绍了Retrofit,这次我们来了解一下Rxjava。

Rxjava的概念和使用,如果铺开来讲,可以讲很长,同上一篇一样,我不打算把这篇博客写成一个技术索引,或者大全,我只是希望能让初学者能够抛开那些复杂的概念(在Rxjava中,你能看到各种让初学者头大的名词,诸如响应式编程,调度器,订阅者,观察者等等),对Rxjava有一个基础的认识,同时知道如何在代码中使用它。

ps:关于响应式编程,我也所知甚少,有机会我会专门写一篇博客来介绍它。

一. 什么是Rxjava
首先,Rxjava的模式,基本上就是观察者模式(很抱歉我没办法不提这个概念),但是你不需要理解观察者模式是什么。
如果你是一个android开发者,你应该知道view的一个函数setOnClickListener(),这就是典型的一个观察者模式。当你想要观察一个view(比如一个button)的行为时,你会声明一个OnClickListener,然后通过setOnClickListener()方法,把这个view跟OnClickListener关联起来,这样,每当view被点击的时候,OnClickListener都会得知。

Rxjava也是这样,它有一个观察者Observer,一个被观察者Observable,还有一个方法subscribe用来将两者联系起来。

但是,其实我们忽略了另外一个要素:事件。
在上面的OnClickListener的例子里面,实际上是隐藏着一个事件的,这个事件就是”点击”,因为OnClickListener只能处理点击事件,所以没有必要特别说明。
但是Rxjava可以处理所有事件,被观察者Observable发出的任何事件,都会通知给观察者Observer。
这个事件可能是任何东西,比如它可能是一个字符串(最简单的场景),也可能是一个网络请求(Rxjava最常用的场景),或者别的什么。

那么代码看起来应该是这样的:

//声明一个观察者
Observer observer = new Observer();
//同时定义观察者收到事件后的反应
observer.handleEvent(){
    @Override
    public void whenGetEvent() {
        //TODO
    }};

//声明一个被观察者
Observable observable = new Observable();
//同时为被观察者添加一个可被观察到的事件
observable.createEvent(new Event());

//绑定观察者和被观察者
Observable.subscribe(Observer);

上面都是伪代码(都是假的!!),看上去很扯,但是基本上表达了Rxjava的流程。

其实看起来很复杂的Rxjava,写到这里大家就可以使用了。。。
上面的代码,我给大家写一下真正的代码:

//一样的,创建一个观察者,并定义观察者收到事件后的反应
//但是与之前我们的伪代码不同的是,这里观察者可以定义三种行为,分别是下一个事件发生时,所有事件结束时还有出错时。这里其实还隐藏着一个概念,那就是观察者不只是可以接受一个事件,它还可以接受一组事件
Observer<String> observer = new Observer<String>() {
    @Override
    public void onNext(String s) {
        Log.d(tag, "Item: " + s);
    }

    @Override
    public void onCompleted() {
        Log.d(tag, "Completed!");
    }

    @Override
    public void onError(Throwable e) {
        Log.d(tag, "Error!");
    }
};

//然后定义一个被观察者,同时定义它可被观察的事件
//这里,我们的事件很简单,就是传3个字符串给观察者
Observable observable = Observable.create(new Observable.OnSubscribe<String>() {
    @Override
    public void call(Observer<? super String> observer) {
        observer.onNext("string one");
        observer.onNext("string two");
        observer.onNext("string three");
        observer.onCompleted();
    }
});

//最后,绑定观察者和被观察者
Observable.subscribe(Observer);

总结一下,对于观察者来说,它比我们预想的要强大,因为它可以观察到更多的事件,还能观察到事件的结束和出错。这对我们来说是非常有用的,想象一下,如果我们需要发送2个http请求并接受返回数据,展示到UI中(当然,不建议这么做),那我们现在只需要一个观察者就可以搞定了
而对于被观察者来说,我认为这部分才是rxjava的难点所在,我们只是举了一个非常非常简单的例子。而在实际使用中,有大量的被观察者事件可以为我们所用。

Observable有非常多的方法可供我们选择,但是我并不想把它们写在这里。这样的话,我的这篇博客就跟一篇使用说明差不多了。这是一个很纠结的事情,不把方法罗列出来,就无法说明rxjava的强大,罗列出来,又违背了我的初衷。。。

最终我还是不打算罗列方法,而是给大家再次推荐这篇博客:
http://gank.io/post/560e15be2dca930e00da1083

如果想了解rxjava,一定不能错过这篇文章。

而我接下去,想说一下为何我们要使用rxjava。
rxjava并不能减少你的代码行数。注意,我没有说代码量,而是说的代码行数。它甚至一定程度上会增加你的代码行数。
但是,rxjava可以减少你的代码逻辑量。这听起来很扯淡,但是确实如此:
rxjava通过线性的事件分割,来减少我们的代码复杂度。其实这在我们现实生活中也是如此。比如制作火箭,这听起来非常非常非常复杂。如果我们要把它作为一个事件来处理,绝大多数人都会觉得这无法实现。
而如果我们把这个事件分割,比如分割成制作火箭的燃料,制作火箭的金属,拼装火箭几步(好吧,看起来仍是不可实现的。。。),那它看起来起码是有的放矢了。
rxjava就是通过各种方法,来帮我们分割了这些事件,随着分割粒度的细化,我们也可以达到部分代码的复用。

以上就是这篇博客的全部了,我知道这次写得比较晦涩,如有问题,欢迎大家来探讨。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值