Day4-1 rxjava
参考简书:https://www.jianshu.com/p/a406b94f3188
https://www.jianshu.com/p/cd984dd5aae8
c
1.案例引入理解观察者模式
运钞车负责运送纸币,警车负责保护运钞车,但是有一批强盗伺机截获运钞车,当车出动的时候,强盗抢钱,警察保护钱
2.原理分析
- Rxjava原理 基于 一种扩展的观察者模式
- Rxjava的扩展观察者模式中有4个角色:
角色 | 作用 | 类比 |
---|---|---|
被观察者(Observable) | 产生事件 | 运钞车 |
观察者(Observer) | 接收事件,并给出响应动作 | 强盗+警察 |
订阅(Subscribe) | 连接 被观察者 & 观察者 | 观察等待 |
事件(Event) | 被观察者 & 观察者 沟通的载体 | 运钞车出动 |
二.基本使用
0.添加依赖:
//RxJava依赖:主要用于消息传递
implementation 'io.reactivex.rxjava2:rxjava:2.2.8'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
1.简单实现
步骤1:创建被观察者 (Observable )& 生产事件
步骤2:创建观察者 (Observer )并 定义响应事件的行为
步骤3:通过订阅(Subscribe)连接观察者和被观察者
//1 创建被观察者.
Observable observable = Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(ObservableEmitter emitter) throws Exception {
emitter.onNext("1");
emitter.onError(new RuntimeException("大丰收的"));
emitter.onNext("2");
emitter.onComplete();
}
});
//2 观察者
Observer observer = new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
Log.i(TAG, "onSubscribe: ");
}
@Override
public void onNext(String s) {
Log.i(TAG, "onNext: "+s);
}
@Override
public void onError(Throwable e) {
Log.i(TAG, "onError: ");
}
@Override
public void onComplete() {
Log.i(TAG, "onComplete: ");
}
};
//3 绑定
observable.subscribe(observer);
三.线程切换
- 在 RxJava 的默认规则中,事件的发出和消费都是在同一个线程(主线程),这显然不是我们要的。
- 因为我们希望:
- 被观察者 (Observable) 在 子线程 中生产事件(如实现耗时操作/IO操作/网络请求等等)。
- 观察者(Observer)在 主线程 中接收事件(即实现UI操作)。
- 为了解决上述冲突,即实现 真正的异步操作,我们需要对RxJava进行 线程控制(也称为调度 / 切换)。
- 我们在后面讲解retrofit+rxjava+rxandroid结合在一起进行网络请求的时候就会深有体会----------
Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(ObservableEmitter emitter) throws Exception {
emitter.onNext("1");
emitter.onNext("2");
}
})
.subscribeOn(Schedulers.io())//一般被观察者进行网络请求
.observeOn(AndroidSchedulers.mainThread())//观察者主线程中进行UI刷新
.subscribe(new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String s) {
Log.i(TAG, "onNext: "+s);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
四.常用操作符
1.create(): 通过函数从头开始创建一个Observable:上面的案例就是用的这个
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> emitter) throws Exception {
//isDisposed() 是否有订阅关系
if (!emitter.isDisposed()) {
emitter.onNext("1");
emitter.onNext("2");
emitter.onNext("3");
emitter.onComplete();
emitter.onNext("4");
}
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String s) {
Log.e("GAO", "onNext--" + s);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
Log.e("GAO", "onComplete");
}
});
2.just() :将对象转换为发出该对象的Observable,自己打印查看结果
Observable.just("你好", "RxJava").subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String s) {
Log.e("GAO", "onNext--" + s);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
Log.e("GAO", "onComplete");
}
});
3.merge() — 将多个Observable组合成一个
Observable.merge(Observable.just("你好", "RxJava"), Observable.just("你好2", "RxJava2")).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String s) {
Log.e("GAO", "onNext--" + s);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
Log.e("GAO", "onComplete");
}
});