简介:大三学生党一枚!主攻Android开发,对于Web和后端均有了解。
个人语录:取乎其上,得乎其中,取乎其中,得乎其下,以顶级态度写好一篇的博客。
RxJava教程 (一)
一.RxJava简单介绍
可能刚接触RxJava
的朋友并不知道RxJava
真正的作用是什么,看书上说的什么函数响应式编程,极大的简化项目,感觉说了和没说一样,还是不了解它的作用是什么!可以用一个对比来简单描述RxJava
的优点。
在Android
开发过程中,登录操作很常见。用常规操作来实现,必须在子线程中去访问网络,然后借助Handler
切换到主线程更新UI
,需要复杂的操作来实现这个简单的功能。但是使用RxJava只需要一行代码就能搞定!从这个案例中,我们可以看出对于开发者来说RxJava最大的优点就是简化项目,各种链式操作保持清晰的逻辑。
要使用RxJava需要先引入依赖:
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
implementation 'io.reactivex.rxjava2:rxjava:2.1.3'
二.RxJava的理解
先介绍两个关键的名词
Observer:观察者 可以理解为消费者
Observable:被观察者 可以理解为生产者
当被观察者发生变化时,会立即通知观察者!
2.1 上下游的比喻
如图所示:
Observable
作为上游,水流源源不断的经过纽带流往下游- 纽带:当纽带被关闭时,水流就无法流到下游,纽带开启,水流到达
Observer
作为下游,收到上游的水流。- 水流:就是事件
这里结合一段最简单的RxJava代码来解释
Observable.create(new ObservableOnSubscribe<Integer>() {
//上游 Observable
@Override
public void subscribe(ObservableEmitter<Integer> e) throws Exception { //向水流中添加一个next事件,传递给下游有对应接收next事件的方法
e.onNext(1);
//在水流中的是一个complete事件,传递给下游有对应接收next事件的方法
e.onComplete(2);
}
})
.subscribe(
//subscible 就是纽带,将上下游连接起来
new Observer<Integer>() {
//observer 表示 下游
Disposable d;
//Disposable表示纽带开关
@Override
public void onSubscribe(Disposable d) {
this.d=d;
}
@Override
public void onNext(Integer integer) {
//用来接受上游的next事件
Log.d(TAG, "onNext: "+integer);
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "onError: "+e.getMessage());
}
@Override
public void onComplete() {
//用来接受上游的complete事件`在这里插入代码片`
Log.d(TAG, "onComplete ");
}
});
整个过程一气呵成,一段代码搞定事件传递。
2.2 浅观设计模式
从设计模式角度来看RxJava
,观察者模式又被称为发布——订阅模式。最典型的案例就是微信公众号,微信用户订阅微信公众号,当微信公众号产生新消息时,所有订阅了该微信公众号的用户,都能收到该消息。这就是观察者模式最核心的思想。
微信公众号:被观察者(Observable
)
微信用户:观察者(Observer
)
对应于上下游的案例,上游产生水流下游就会接受到!
上游:被观察者(Observable
)
下游:观察者(Observer
)
由于本篇主要介绍RxJava
,关于设计模式就不深入。
三.RxJava基础知识
在上面的代码中出现了ObservableEmitter
和Disposable
3.1 ObservableEmitter
ObservableEmitter
: Emitter
是发射器的意思,他就是用来发出事件的,他可以发出三种类型的事件,通过调用emitter
的onNext(T value)
、onComplete()
和onError(Throwable error)
就可以分别发出next
事件、complete
事件和error
事件。
发出事件需要遵守一定的规则
onNext()
:上游可以发出多个onNext
事件下游也能接受到很多个onNext
事件。onComplete()
:上游发出一个onComplete
事件后,可以继续发出其他事件,但是下游接受到onComplete
事件以后,就停止接收事件。onError()
:和onComplete
相同,上游发出onError
事件后继续发出其他事件,而下游接收到onError
事件后不再接收事件。- 上游可以不发出onComplete和onError事件
onComplete
和onError
必须互斥且唯一,不可以同时发出多个onComplete
事件也不可以同时发出多个onError
事件,也不可以先发出onComplete
事件再发出onError
事件,反之亦然。
3.2 Disposable
他就相当于我们之前提到的纽带,当纽带被关闭即调用disposable.dispose()
方法,下游就接收不到上游发出的任何事件。但这并不影响上游继续发出事件。
四.简单的RxJava案例
Observable.create(new ObservableOnSubscribe<Integer>() {
//被观察者
@Override
public void subscribe(ObservableEmitter<Integer> e) throws Exception {
e.onNext(1);
Log.d(TAG, "subscribe: next1");
e.onNext(2);
Log.d(TAG, "subscribe: next2");
e.onComplete();
Log.d(TAG, "subscribe: complete");
e.onNext(3);
Log.d(TAG, "subscribe: next3");
}
}).subscribe(new Observer<Integer>() {
//观察者
Disposable d;
@Override
public void onSubscribe(Disposable d) {
this.d=d;
}
@Override
public void onNext(Integer integer) {
//Disposable能够切断水管
Log.d(TAG, "onNext: "+integer);
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "onError: "+e.getMessage());
}
@Override
public void onComplete() {
Log.d(TAG, "onComplete ");
}
});
查看log日志如图:
可见当上游发出onComplete事件被下游接收以后,上游可以继续发出事件,而下游不再接收。
我们在实验一下Disposable
的作用
Observable.create(new ObservableOnSubscribe<Integer>() {
//被观察者
@Override
public void subscribe(ObservableEmitter<Integer> e) throws Exception {
e.onNext(1);
Log.d(TAG, "subscribe: next1");
e.onNext(2);
Log.d(TAG, "subscribe: next2");
e.onComplete();
Log.d(TAG, "subscribe: complete");
e.onNext(3);
Log.d(TAG, "subscribe: next3");
}
}).subscribe(new Observer<Integer>() {
//观察者
Disposable d;
@Override
public void onSubscribe(Disposable d) {
this.d=d;
}
@Override
public void onNext(Integer integer) {
//Disposable能够切断水管
if(integer>=2){
//当Integer大于2的时候关闭纽带,下游接受不到任何事件,上游可以继续发送
d.dispose();
}
Log.d(TAG, "onNext: "+integer);
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "onError: "+e.getMessage());
}
@Override
public void onComplete() {
Log.d(TAG, "onComplete ");
}
});
总结
RxJava的知识比较多,需要几篇能够说完也不确定,但是我会保证每一篇的质量!这篇借鉴了很多前辈的博客,尤其是上下游的概念。
相关阅读: