转自:https://www.jianshu.com/p/cd3557b1a474
RxJava2.0——从放弃到入门
<!-- 作者区域 -->
<div class="author">
<a class="avatar" href="/u/5fd2523645da">
<img src="//upload.jianshu.io/users/upload_avatars/2477378/2d661a47-cf24-4293-ae3a-4453de1000a9.jpg?imageMogr2/auto-orient/strip|imageView2/1/w/96/h/96" alt="96">
肖邦kaka
关注
6.5
2018.04.02 23:30*
字数 2475
阅读 68757评论 24喜欢 174赞赏 1
<!-- 文章内容 -->
<div data-note-content="" class="show-content">
<div class="show-content-free">
<h2>前言</h2>
终于到了讲RxJava这一期,RxJava是笔者个人非常喜欢的一个开源库,它很好的将链式编程风格和异步结合在一起。RxJava其实已经推出很久了,可以说是已经很火了,但是目前仍然还有相当一部分Android开发者没有使用过,甚至说是想用,却不知道怎么用,或者不知道自己的项目哪里可以用到,本着让广大开发者理解并且上手项目,从放弃到入门,故推出这边文章。
注:本文所有的具体代码实现都在文章最后的github链接上
学习RxJava2.0之前需不需要学习RxJava1.0
首先,RxJava1.0和RxJava2.0的核心思想都是观察者模式,只不过RxJava2.0在RxJava1.0的基础对一些方法进行了优化,方便于开发者更好地理解其编程思想,同时又增加了一部分新的方法解决1.0存在的问题,例如背压等。所以,如果你学习过RxJava1.0那么很好,你可能已经理解了什么是观察者模式;如果你没有学过RxJava1.0,当然也不必着急,因为本文将从最基本的观察者模式讲起,让你从最基本最简单的角度入手RxJava。综上所述,不管你是不是学过RxJava1.0,都不会影响你学习本篇文章。
观察者模式
在学习RxJava2.0之前,我们必须要弄明白什么是观察者模式。按照我的惯例,先上一个百度百科的权威介绍
百度百科的观察者模式介绍
简单介绍一下,A和B两个,A是被观察者,B是观察者,B对A进行观察,B并不是需要时刻盯着A,而是A如果发生了变化,会主动通知B,B会对应做一些变化。举个例子,假设A是连载小说,B是读者,读者订阅了连载小说,当小说出现了新的连载的时候,会推送给读者。读者不用时刻盯着小说连载,而小说有了新的连载会主动推送给读者。这就是观察者模式。而RxJava正是基于观察者模式开发的。
观察者模式.png
RxJava2.0的基本使用
理解好了观察者模式,我们开始RxJava2.0的学习。首先引入RxJava2.0相关的类库。
compile 'io.reactivex.rxjava2:rxjava:2.0.1'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
正确使用姿势:
第一步:创建连载小说(被观察者)
//被观察者
Observable novel=Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> emitter) throws Exception {
emitter.onNext("连载1");
emitter.onNext("连载2");
emitter.onNext("连载3");
emitter.onComplete();
}
});
Observable中文意思就是被观察者,通过create方法生成对象,里面放的参数ObservableOnSubscribe<T>,可以理解为一个计划表,泛型T是要操作对象的类型,重写subscribe方法,里面写具体的计划,本文的例子就是推送连载1、连载2和连载3,在subscribe中的ObservableEmitter<String>对象的Emitter是发射器的意思。ObservableEmitter有三种发射的方法,分别是void onNext(T value)、void one rror(Throwable error)、void onComplete(),onNext方法可以无限调用,Observer(观察者)所有的都能接收到,onError和onComplete是互斥的,Observer(观察者)只能接收到一个,OnComplete可以重复调用,但是Observer(观察者)只会接收一次,而onError不可以重复调用,第二次调用就会报异常。
第二步:创建读者(观察者)
//观察者
Observer<String> reader=new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
mDisposable=d;
Log.e(TAG,"onSubscribe");
}
<span class="hljs-meta">@Override</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onNext</span><span class="hljs-params">(String value)</span> </span>{
<span class="hljs-keyword">if</span> (<span class="hljs-string">"2"</span>.equals(value)){
mDisposable.dispose();
<span class="hljs-keyword">return</span>;
}
Log.e(TAG,<span class="hljs-string">"onNext:"</span>+value);
}
<span class="hljs-meta">@Override</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onError</span><span class="hljs-params">(Throwable e)</span> </span>{
Log.e(TAG,<span class="hljs-string">"onError="</span>+e.getMessage());
}
<span class="hljs-meta">@Override</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onComplete</span><span class="hljs-params">()</span> </span>{
Log.e(TAG,<span class="hljs-string">"onComplete()"</span>);
}
};