原文出处
RxJava
文章目录
1.观察者 observer
普通控件的观察者:
button -> onclicklistener -> setonclicklistener -> onclick
被观察者 -> 观察者 -> 订阅关系 -> 执行事件
RxJava观察者:
observable -> observer -> subscribe -> onnext/oncompleted/onerror
被观察者 -> 观察者 -> 订阅关系 -> 执行事件
2.Observer / Subscribe
-
两者用法几乎一样
-
主要区别
subscribe有两个多的实现接口: onStart 事件未发送前调用; 不能执行更新UI操作 unSubscribe 取消订阅
3.被观察者 observable
- 创建事件
- observable.create(new)
- observable.just(args,args)
- observable.form(arr[])
4.线程切换一 scheduler
-
线程切换
- 指定每一段代码应该运行在什么什么样的线程上
schedulers.immediate当前线程 schedulers.newthread新线程 schedulers.io无线线程池(不要有计算工作) schedulers.computation计算线程 Androidschedulers.mainthread主线程
subscribeon()指定发生的线程
observeon指定消费的线程
Observable.just(1, 2, 3, 4) .subscribeOn(Schedulers.io()) // 指定 subscribe() 发生在 IO 线程 .observeOn(AndroidSchedulers.mainThread()) // 指定 Subscriber 的回调发生在主线程 .subscribe(new Action1<Integer>() { @Override public void call(Integer number) { Log.d(tag, "number:" + number); } });
5.不完整定义‘订阅’关系
- action0
- 定义oncompleted
- action1
- 定义onnext
- 定义onerroe
使用
Action1<String> onNextAction = new Action1<String>() {
// onNext()
@Override
public void call(String s) {
Log.d(tag, s);
}
};
Action1<Throwable> onErrorAction = new Action1<Throwable>() {
// onError()
@Override
public void call(Throwable throwable) {
// Error handling
}
};
Action0 onCompletedAction = new Action0() {
// onCompleted()
@Override
public void call() {
Log.d(tag, "completed");
}
};
// 自动创建 Subscriber ,并使用 onNextAction 来定义 onNext()
observable.subscribe(onNextAction);
// 自动创建 Subscriber ,并使用 onNextAction 和 onErrorAction 来定义 onNext() 和 onError()
observable.subscribe(onNextAction, onErrorAction);
// 自动创建 Subscriber ,并使用 onNextAction、 onErrorAction 和 onCompletedAction 来定义 onNext()、 onError() 和 onCompleted()
observable.subscribe(onNextAction, onErrorAction, onCompletedAction);
6.事件变换
-
funx
- 类似于action
- 是有返回值的
- 配合map使用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2JmtbBL2-1575297141406)(C:\Users\Primer4\Documents\学习笔记\1575295612762.png)]
-
map 一对一
-
flatmap 一对多
-
lift变换
-
compose整体变换
7.线程切换二
- 多次切换线程
多次调用observeon,之后的操作就是切换到的线程上
subscribeon只能调用一次,放在任何位置都可以,当被多次调用时候,只有第一个起作用
Observable.just(1, 2, 3, 4) // IO 线程,由 subscribeOn() 指定
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.newThread())
.map(mapOperator) // 新线程,由 observeOn() 指定
.observeOn(Schedulers.io())
.map(mapOperator2) // IO 线程,由 observeOn() 指定
.observeOn(AndroidSchedulers.mainThread)
.subscribe(subscriber); // Android 主线程,由 observeOn() 指定
-
doonsubscribe
-
和onstart方法一样,在subscribe调用后,事件发送前执行
-
doonsubcriber的区别是可以指定线程
-
doonsubscribe执行在里subscribeon最近的线程