RxJava操作符——Observable.create

使用

通過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是互斥的

 

 

 

發佈了280 篇原創文章 · 獲贊 44 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章