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,方便初學者參考使用