RxAndroid GitHub地址: https://github.com/ReactiveX/RxAndroid
环境搭建
RxAndroid环境只需求要引入如下项目即可,我们不但需要RxAndroid项目还需要RxJava项目。
implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
implementation 'io.reactivex.rxjava2:rxjava:2.x.x'
简单的demo:
//创建一个被观察者(发布者)
Observable observable = Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
subscriber.onNext(1001);
subscriber.onNext(1002);
subscriber.onNext(1003);
subscriber.onCompleted();
}
});
//创建一个观察者
Subscriber<Integer> subscriber = new Subscriber<Integer>() {
@Override
public void onCompleted() {
Log.d(TAG, "onCompleted.. ");
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "subscriber onError.. " + e.getMessage());
}
@Override
public void onNext(Integer integer) {
Log.d(TAG, "onNext.. integer:" + integer);
}
};
//注册观察者(这个方法名看起来有点怪,还不如写成regisiterSubscriber(..)或者干脆addSubscriber(..))
//注册后就会开始调用call()中的观察者执行的方法 onNext() onCompleted()等
observable.subscribe(subscriber);
对于线程还需要注意
- create() , just() , from() 等 --- 事件产生
- map() , flapMap() , scan() , filter() 等 -- 事件加工
- subscribe() -- 事件消费
事件产生:默认运行在当前线程,可以由 subscribeOn() 自定义线程
事件加工:默认跟事件产生的线程保持一致, 可由 observeOn() 自定义线程
事件消费:默认运行在当前线程,可以有observeOn() 自定义
from:在Rxndroid的from操作符到2.0已经被拆分成了3个,fromArray, fromIterable, fromFuture接收一个集合作为输入,然后每次输出一个元素给subscriber。
Observable.fromArray(new Integer[]{1, 2, 3, 4, 5}).subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
Log.i(TAG, "number:" + integer);
}
});
结果:number:1
number:2
number:3
number:4
number:5
filter:条件过滤,去除不符合某些条件的事件。举个栗子:
Observable.fromArray(new Integer[]{1, 2, 3, 4, 5})
.filter(new Predicate<Integer>() {
@Override
public boolean test(Integer integer) throws Exception {
// 偶数返回true,则表示剔除奇数,留下偶数
return integer % 2 == 0;
}
}).subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
Log.i(TAG, "number:" + integer);
}
});
结果:number:2
number:4
take:最多保留的事件数。
Observable.just("1", "2", "6", "3", "4", "5").take(2).subscribe(new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String value) {
Log.d(TAG,value);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
结果:1
2
doOnNext:如果你想在处理下一个事件之前做某些事,就可以调用该方法
Observable.fromArray(new Integer[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}).filter(new Predicate<Integer>() {
@Override
public boolean test(Integer integer) throws Exception {
// 偶数返回true,则表示剔除奇数
return integer % 2 == 0;
}
})// 最多保留三个,也就是最后剩三个偶数
.take(3).doOnNext(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
// 在输出偶数之前输出它的hashCode
Log.i(TAG, "hahcode = " + integer.hashCode() + "");
}
}).subscribe(new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Integer value) {
Log.i(TAG, "number = " + value);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
结果:hahcode = 2
number = 2
hahcode = 4
number = 4
hahcode = 6
number = 6
使用场景:
- 界面需要等到多个接口并发取完数据,再更新
-
Observable<String> observable1 = Observable.create(new ObservableOnSubscribe<String>() { @Override public void subscribe(ObservableEmitter<String> e) throws Exception { e.onNext("haha"); } }).subscribeOn(Schedulers.newThread()); Observable<String> observable2 = Observable.create(new ObservableOnSubscribe<String>() { @Override public void subscribe(ObservableEmitter<String> e) throws Exception { e.onNext("hehe"); } }).subscribeOn(Schedulers.newThread()); Observable.merge(observable1, observable2) .subscribeOn(Schedulers.newThread()) .subscribe(new Observer<String>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(String value) { Log.d(TAG,value); } @Override public void onError(Throwable e) { } @Override public void onComplete() { } });
- 界面按钮需要防止连续点击的情况
RxView.clicks(button)
.throttleFirst(1, TimeUnit.SECONDS)
.subscribe(new Observer<Object>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Object o) {
Log.i(TAG, "do clicked!");
}
});
- 响应式的界面 比如勾选了某个checkbox,自动更新对应的preference
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
RxSharedPreferences rxPreferences = RxSharedPreferences.create(preferences);
Preference<String> username = rxPreferences.getString("username");
Preference<Boolean> showWhatsNew = rxPreferences.getBoolean("show-whats-new", true);
username.asObservable().subscribe(new Action1<String>() {
@Override public void call(String username) {
Log.d(TAG, "Username: " + username); 读取到当前值
}
}
RxCompoundButton.checks(showWhatsNewView)
.subscribe(showWhatsNew.asAction());