RxJava的初步使用(一)

一直听说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发送了“跳舞”,“敲代码”,Observer在onNext方法中接收数据

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:过滤条件

例如锅炉输入框输入的内容是否为空:

.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


interval:计时器

例如每一秒执行一次:

io.reactivex.Observable.interval(0,1, TimeUnit.SECONDS)

take:执行多少次

例如与计时器结合(执行10次)

io.reactivex.Observable.interval(0,1, TimeUnit.SECONDS)
                .take(count+1)

RxJava线程切换:

如果执行耗时操作,

例如网络操作,则可以使用

.subscribeOn(rx.schedulers.Schedulers.io())
则可以直接切换到io线程中

如果需要切换到主线程,则可以使用:

.observeOn(AndroidSchedulers.mainThread())
这样便可以灵活切换线程



你可能感兴趣的:(Android)