RxJava一篇入门文章
文章非原创,是对他人文章的实践、参考和整理。
参考链接:
- www.jianshu.com/p/801f5f467… (概念的东西讲的简洁明了,RxJava版本比较老了)
- juejin.cn/post/684490…
概念
重点:
- RxJava 就是异步
- RxJava 的异步实现,是通过一种扩展的观察者模式来实现的。
- 一个响应式编程框架
- 最厉害之处是多种操作符,且可以自定义操作符
在IAM四十二的文章中使用RxJava有个概念让我很绕,他将Observable定义为被观察者,Subscriber定义为观察者
/**
* 被观察者,事件源
*/
private Observable<String> myObserveable;
/**
* 观察者
*/
private Subscriber<String> mySubscriber;
很绕的原因是Subscriber中译过来是订阅者的意思。 后来看到玉刚老师的文章才理顺了。
RxJava有三个基本元素:
- 被观察者(Observable)
- 观察者(Observer)
- 订阅(subscribe)
一、准备工作
引入rxjava的库
implementation 'io.reactivex.rxjava2:rxjava:2.1.4'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
二、实现
- 简单实现
被观察者、观察者、订阅动作,一气呵成,有点感觉了没有?
/* 创建被观察者 */
Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> e) throws Exception {
Log.d(TAG, "=========================currentThread name: " + Thread.currentThread().getName());
e.onNext(1);
e.onNext(2);
e.onNext(3);
e.onComplete();
}
});
/* 创建观察者 */
Observer<Integer> observer = new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
Log.d(TAG, "======================onSubscribe");
}
@Override
public void onNext(Integer integer) {
Log.d(TAG, "======================onNext " + integer);
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "======================onError");
}
@Override
public void onComplete() {
Log.d(TAG, "======================onComplete");
}
};
/* 订阅 */
observable.subscribe(observer);
- 简写
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> e) throws Exception {
Log.d(TAG, "=========================currentThread name: " + Thread.currentThread().getName());
e.onNext(1);
e.onNext(2);
e.onNext(3);
e.onComplete();
}
}).subscribe(new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
Log.d(TAG, "======================onSubscribe");
}
@Override
public void onNext(Integer integer) {
Log.d(TAG, "======================onNext " + integer);
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "======================onError");
}
@Override
public void onComplete() {
Log.d(TAG, "======================onComplete");
}
});
二、操作符
概念
玉刚老师举的例子
其实可以把 RxJava 比喻成一个做果汁,家里有很多种水果(要发送的原始数据),你想榨点水果汁喝一下,这时候你就要想究竟要喝什么水果汁呢?如果你想喝牛油果雪梨柠檬汁,那你就要把这三种水果混在一起榨汁(使用各种操作符变换你想发送给观察者的数据),榨完后,你就可以喝上你想要的果汁了(把处理好的数据发送给观察者
要发送的数据 -> 通过操作符处理 -> 发送给观察者
正确的做法就是使用操作符去处理数据,而观察者中只处理结果。
操作符并不是符号,而是方法。
操作符号详解:juejin.cn/post/684490…