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<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線程中執行,執行完後切換到主線程執行,邏輯非常簡潔


2.在子線程中執行耗時操作,執行完成後將結果返回然後過濾,然後將過濾後的結果返回到主線程中執行
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,方便初學者參考使用




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章