RxJava是我在半年前研究MVP架構的時候看到的,當時不以爲然,沒有細看,後來在網上到處都能看到這個R君,我才發現原來它這麼流行。既然和R君這麼有緣,那我們就深入瞭解吧。
認識RxJava
之前使用過EventBus或者Otto的小夥伴可能應該能對RxJava的理解快一些,因爲很類似,編程模式都屬於觀察者模式。當然也少不了觀察者(Subscriber)和訂閱者(Observable),而RxJava最好用的地方之一就是鏈式編碼,把觀察者和訂閱之通過訂閱事件,串在一起,讓編碼的人感覺很”爽”!就像這樣下面的代碼,是打印出”robot”。
final String name = "robot";
Observable.just(name).subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
Log.i("rxjava", s);
}
});
當然,還沒開始學RxJava,並不容易看懂,現在就是見個面,看見對方長得如此漂亮,自然想深入瞭解啊!
簡單用法
依賴引入,目前的最新版本:
compile 'io.reactivex:rxjava:1.1.1'
compile 'io.reactivex:rxandroid:1.1.0'
然後我們分步驟,先能上手,可以簡單使用RxJava。前文說過,我們需要觀察者,訂閱者,然後通過一個訂閱方法,把兩者連起來,就是Rxjava最基本的使用。所有就按照這個步驟:
1、創建觀察者(Subscriber):
Subscriber<String> subscriber = new Subscriber<String>() {
@Override
public void onCompleted() {
Log.i("rxjava", "completed");
}
@Override
public void onError(Throwable e) {
Log.e("rxjava", "error");
}
@Override
public void onNext(String s) {
Log.i("rxjava", s);
}
};
看上面的代碼,要求複寫三個方法,其中”onNext”方法就是觀察者要執行的事件,類似OnClickListener裏面的OnClick方法。”onError”爲事件隊列異常執行的方法,”onCompleted”爲事件隊列完成實行的方法。
2、創建訂閱者(Observable):
Observable observable = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("robot");
subscriber.onNext("rose");
subscriber.onCompleted();
}
});
上面的代碼意思是會調用觀察者subscriber的onNext方法兩次,和onCompleted方法。
3、執行訂閱:
observable.subscribe(subscriber);
通過subscribe()方法把觀察者和訂閱者鏈接,那麼上述的事件就會執行了。
鏈式調用
那麼把上面的代碼寫在一起,就是我開頭舉得例子了,就是鏈式調用。
Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("robot");
subscriber.onNext("rose");
subscriber.onCompleted();
}
}).subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
Log.i("rxjava", "completed");
}
@Override
public void onError(Throwable e) {
Log.e("rxjava", "error");
}
@Override
public void onNext(String s) {
Log.i("rxjava", s);
}
});
簡單的寫法
上面的訂閱者(Observable)在創建過程中使用了create()方法,當然這是最基本的創建方法,不過還有更簡單的辦法來完成Observable對象的創建:
Observable observable = Observable.just("robot","rose");
使用just()方法和上面能達到一樣的效果,它將傳入的參數依次發送出去。還可以這麼寫:
String[] names = {"robot", "rose"};
Observable observable = Observable.from(names);
使用from()方法將傳入的數組或 Iterable 拆分成具體對象後,依次發送出去。
完整代碼:
just
Observable.just("robot","rose").subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
Log.i("rxjava", "completed");
}
@Override
public void onError(Throwable e) {
Log.e("rxjava", "error");
}
@Override
public void onNext(String s) {
Log.i("rxjava", s);
}
});
from
String[] names = {"robot", "rose"};
Observable.from(names).subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
Log.i("rxjava", "completed");
}
@Override
public void onError(Throwable e) {
Log.e("rxjava", "error");
}
@Override
public void onNext(String s) {
Log.i("rxjava", s);
}
});
寫到這裏,我們看到這個RxJava很簡單嘛,嘿嘿,其實難的還在後面呢,RxJava的真正用處在於異步操作的方便,所以後續我會繼續寫RxJava的異步操作,以及更強大的變換功能。