使用
通過Observable.create()方法傳入一個Observable.OnSubscribe對象來創建Observable
Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("野猿新一");
subscriber.onCompleted();
}
}).subscribe(new Action1<String>() {
@Override
public void call(String s) {
Log.d("Himmy", s);
}
});
RxJava的核心就是響應式編程,下面這段示例能讓你更好地理解什麼是響應式
通過Observable.create()創建了一個Observable,封裝了一個按鈕的點擊事件監聽。
當按鈕點擊的時候調用subscriber.onNext發送事件,這樣在Observer的onNext中可以接受處理該事件。
當按鈕點擊5次後,調用subscriber.onCompleted結束事件的訂閱,回調Observer的onCompleted方法,之後再點擊按鈕該Observer也不會再接收到事件
每當按鈕點擊一次,事件源Observable就發送一次事件,訂閱者Observer就接收到該事件做相關處理,這就是響應式編程
Observable<Integer> observable = Observable.create(new Observable.OnSubscribe<Integer>() {
private int count;
@Override
public void call(final Subscriber<? super Integer> subscriber) {
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
subscriber.onNext(++count);
if (count == 5) {
subscriber.onCompleted();
}
}
});
}
});
observable.subscribe(new Observer<Integer>() {
@Override
public void onNext(Integer integer) {
Log.d("Himmy", "onClick:" + integer);
}
@Override
public void onCompleted() {
Log.d("Himmy", "onCompleted");
}
@Override
public void onError(Throwable e) {
Log.d("Himmy", "onError");
}
});
通過Observable.create你可以創建任何同步的或者異步的事件源。比如說封裝一個網絡請求、數據庫處理、文件讀寫等。
如下僞代碼演示封裝一個網絡請求創建一個Observable
Observable.create(new Observable.OnSubscribe<UserInfo>() {
@Override
public void call(final Subscriber<? super UserInfo> subscriber) {
HttpClient.getUserInfo(new HttpCallback() {
@Override
public void onSuccess(UserInfo info) {
subscriber.onNext(info);
subscriber.onCompleted();
}
@Override
public void onError(Exception e) {
subscriber.onError(e);
}
});
}
});
源碼解析
RxJva現在已經更新到了3.0.0,整個項目的代碼量和複雜度都增加不少,爲了降低理解難度,本文解析的是RxJava1.0.0的源碼,其核心原理是一樣的,爲了便於理解,會刪除源碼中一些不相關的代碼,或者以僞代碼的形式展示
create方法內部其實就是新建一個Observable,參數爲用戶自己實現的OnSubscribe
public final static <T> Observable<T> create(OnSubscribe<T> f) {
return new Observable<T>(f);
}
傳入的OnSubscribe被Observable內部持有,在調用subscribe方法的時候會用到
public class Observable<T> {
final OnSubscribe<T> onSubscribe;
protected Observable(OnSubscribe<T> f) {
this.onSubscribe = f;
}
}
再看Observable.subscribe()方法,裏面調用了之前傳入的OnSubscribe對象的call()方法,暫且叫這個步驟叫做開啓事件源吧。
public final Subscription subscribe(Subscriber<? super T> subscriber) {
try {
// 省略其他代碼
onSubscribe.call(subscriber);
// 省略其他代碼
return subscriber;
} catch (Throwable e) {
// 省略其他代碼
}
}
總結
- 通過Observable.create創建Observable
- create方法需出入一個實現call方法的Observable.OnSubscribe對象
- call方法中通過調用subscriber.onNext來發送事件
- call方法中通過調用subscriber.onCompleted結束事件訂閱
- call方法中通過調用subscriber.onError來拋出異常
- onCompleted和onError是互斥的