您的位置:首页 > 编程语言 > Java开发

RxJava的初步使用(一)

2017-03-31 22:15 183 查看
 一直听说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)

最基本的用法:

Observable<String>observable=Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> e) throws Exception {

e.onNext("跳舞");
e.onNext("敲代码");

e.onComplete();
}
});

Observer<String> observer=new Observer<String>() {
@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<UserParam, ObservableSource<String>>() {
@Override
public ObservableSource<String> apply(UserParam userParam) throws Exception {
//loginWithForm() 登录后获取id

String id = api.loginWithForm(userParam.getUsername(), userParam.getPassword())
.execute().body();
return Observable.just(id);
}
}).flatMap(new Function<id, ObservableSource<User>>() {
@Override
public ObservableSource<User> 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<CharSequence>() {//过滤条件
@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())这样便可以灵活切换线程
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  RxJava 初步