RxAndroid和RxJava的简单使用
近段时间非常火的RxAndroid和RxJava,炒的我心里痒痒的,于是抽空了解了一下基本的使用
配置:
在module的build.grade文件中添加依赖compile 'io.reactivex:rxjava:1.1.0'
compile 'io.reactivex:rxandroid:1.1.0'
使用:
1.在子线程中将数据传入,经过一定处理后过滤结果到主线程中,执行完成后切换到主线程
Observable.just("12") .map(new Func1<String, Object>() {
@Override
public Object call(String s) {
if(TextUtils.isEmpty(s)){
return 0;
}
return Integer.parseInt(s);
}
}).subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<Object>() {
@Override
public void call(Object s) {
//处理s
}
});
说明:just("12")的意思是将数据12传入到map()的回调接口call(s)中,map的参数是个接口Func1,接口中有一个未实现的方法call,其中参数s就是just("12")中传入的数据"12"了,在回调方法call中处理逻辑,最后将处理后的结果返回,最终该结果就会传入到Action1接口的回调方法call的参数中,在这里可以看到,线程的切换非常灵活,只需这样:Observable.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()) 就可以将前面部分逻辑在io线程中执行,执行完后切换到主线程执行,逻辑非常简洁
Observable<String>getInfo(){
//耗时操作...
return "888";
}
getInfo().map(new Func1<String, Object>() {
@Override
public Object call(String s) {
if(TextUtils.isEmpty(s)){
return 0;
}
return Integer.parseInt(s);
}
}).subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<Object>() {
@Override
public void call(Object s) {
//处理s
}
});
3.将数据传入到子线程中执行耗时操作,然后将数据传入主线程中执行回调
final int x=10;
Observable.create(new Observable.OnSubscribe<Object>() {
@Override
public void call(Subscriber<? super Object> subscriber) {
Log.i(this.getClass().getName(),"call");
if(x==1){
subscriber.onError(new Exception("错误了"));
}
//...其他耗时操作
if(x==8){
subscriber.onNext(x);
subscriber.onCompleted();
}
}
}).subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<Object>() {
@Override
public void onCompleted() {
Log.i(this.getClass().getName(),"onCompleted");
}
@Override
public void onError(Throwable e) {
Log.i(this.getClass().getName(),"onError"+e.getMessage());
}
@Override
public void onNext(Object o) {
Log.i(this.getClass().getName(),"onNext"+o);
}
}
这里需要注意的是,使用create(OnSubscribe)时最好是结合subscribe(Subscriber)的回调函数使用,这样一来,才能在
切换到主线程时回调接口中处理UI线程,否则在create方法的参数回调实现中只能处理一些基本的逻辑,无法切换到主线程中
回调显示UI
4.在2的子线程中过滤数据,最后在主线程中回调
//可以是retrofit的网络请求接口
Observable<String>getInfo(){
//耗时操作...
return "888";
}
getInfo().map(new Func1<String, Object>() {
@Override
public Object call(String s) {
if(TextUtils.isEmpty(s)){
throw new Exception("空或者null");
}
return Integer.parseInt(s);
}
}).subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<Object>() {
@Override
public void onCompleted() {
//执行完成了next回调方法后就会调用该回调接口完成回调
Log.i(this.getClass().getName(),"onCompleted");
}
@Override
public void onError(Throwable e) {
//map过滤接口中抛出异常或者网络无法连接都会回调该接口
Log.i(this.getClass().getName(),"onError"+e.getMessage());
}
@Override
public void onNext(Object o) {
//数据能正常返回就会回调该接口
Log.i(this.getClass().getName(),"onNext"+o);
}
}
几个简单的demo,方便初学者参考使用