RxAndroid和RxJava的简单使用

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() {
            @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() {
            @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线程中执行,执行完后切换到主线程执行,逻辑非常简洁


2.在子线程中执行耗时操作,执行完成后将结果返回然后过滤,然后将过滤后的结果返回到主线程中执行
ObservablegetInfo(){
//耗时操作...
return "888";
}


getInfo().map(new Func1() {
            @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() {
            @Override
            public void call(Object s) {
//处理s
            }
        });


3.将数据传入到子线程中执行耗时操作,然后将数据传入主线程中执行回调


final int x=10;
 Observable.create(new Observable.OnSubscribe() {
            @Override
            public void call(Subscriber 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() {
            @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的网络请求接口
ObservablegetInfo(){
//耗时操作...
return "888";
}




getInfo().map(new Func1() {
            @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() {
            @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,方便初学者参考使用




你可能感兴趣的:(android)