一直听说RxJava很火爆,很多大神也写了很多相关的文章,最近从中开始学习Rxjava,自己总结一些比较简单的使用。RxJava是一种响应式编程,使用了观察者模式。依赖:
compile 'io.reactivex.rxjava2:rxjava:2.0.0-RC5' compile 'io.reactivex.rxjava2:rxandroid:2.0.0-RC1'
Observable绑定Observer:Observable.subscribe(Observer)
最基本的用法:
Observableobservable=Observable.create(new ObservableOnSubscribe() { @Override public void subscribe(ObservableEmitter e) throws Exception { e.onNext("跳舞"); e.onNext("敲代码"); e.onComplete(); } }); Observer observer=new Observer() { @Override public void onSubscribe(Disposable d) { d.dispose(); //解除观察 } @Override public void onNext(String value) { Log.i(TAG, "onNext: ="+value); } @Override public void onError(Throwable e) { } @Override public void onComplete() { } }; //进行绑定 observable.subscribe(observer);
Observable:
create():里面需要传进一个ObservOnSubscribe>对象,返回的是一个Observable对象
just():发送数据,可以发送多个数据;
fromCallable():里面需要传入一个 Callable对象,该对象里面的call方法发送数据,效果跟以上例子一样
Observable对象的subscribe方法还可以传一个Consumer对象,实现的accept方法用来接收数据
flatMap():用来对象的转换。例子:
Observable.just(getUserParam()) .flatMap(new Function>() { @Override public ObservableSource apply(UserParam userParam) throws Exception { //loginWithForm() 登录后获取id String id = api.loginWithForm(userParam.getUsername(), userParam.getPassword()) .execute().body(); return Observable.just(id); } }).flatMap(new Function>() { @Override public ObservableSource apply(BaseResult baseResult) throws Exception {
//getUserInfoWithQuery() 可以获取User对象 User user = api.getUserInfoWithQuery(baseResult.getUser_id()).execute().body(); return Observable.just(user); } }));
这样实现了对象的转换。用户的参数(登录信息)=>id=>用户对象=>发送并进行后续的处理
debounce:限定时间执行
例如一个输入框的监听:
RxTextView.textChanges(this.search)
.debounce(300, TimeUnit.MILLISECONDS)//三百毫秒监听一次
例如锅炉输入框输入的内容是否为空:
.filter(new Predicate() {//过滤条件
@Override
public boolean test(CharSequence charSequence) throws Exception {
return charSequence.toString().length() > 0;
}
}).
switchMap: 用法跟flatMap一样,内部实现不同,Observable集合,发射最近Observable发射的数据
RxView.clicks(button).throttleFirst(时间): 用来事件监听,防止反复点击
例如一秒只能点击一次:
RxView.clicks(button).throttleFirst(1, TimeUnit.SECONDS)
merge: 将所有Observable合并起来,并发送所有Observable要发送的数据
例如将本地发送的数据和发射从网络获取的数据合并:
rx.Observable.merge(getDataFromLocal(),getDataFromNet())
//getDataFromLocal方法:获取发射本地数据的Observable,getDataFromNet:获取发射网络数据的Observable
例如每一秒执行一次:
io.reactivex.Observable.interval(0,1, TimeUnit.SECONDS)
例如与计时器结合(执行10次)
io.reactivex.Observable.interval(0,1, TimeUnit.SECONDS)
.take(count+1)
如果执行耗时操作,
例如网络操作,则可以使用
.subscribeOn(rx.schedulers.Schedulers.io())
则可以直接切换到io线程中
如果需要切换到主线程,则可以使用:
.observeOn(AndroidSchedulers.mainThread())
这样便可以灵活切换线程