1. 程式人生 > >RxAndroid從零開始學之二(Observable的其它建立與訂閱形式)

RxAndroid從零開始學之二(Observable的其它建立與訂閱形式)

前一篇文章簡單地寫了Observable、Observer、Subcriber及subcribe()方法的使用。這篇再往下學習一些基礎的知識點。內容也不會長。

Observable的建立的另外方式

我們知道。

Observable<String> mObservable = Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {

            }
 });

create()方法建立一個Observable()物件,而RxJava中還有just()和from()方法可以直到同樣的作用。

just(T t…)

just()的作用也是建立Observable物件,如下:

Observable<String> testJust = Observable.just("Hello","How are you?","yes,i\'m fine,thank you!");

它的效果等同於

final Observable<String> mObservable = Observable.create(new Observable.OnSubscribe<String>() {
            @Override
public void call(Subscriber<? super String> subscriber) { subscriber.onNext("Hello"); subscriber.onNext("How are you?"); subscriber.onNext("Yes,i\'m fine,thank you!"); subscriber.onCompleted(); } });

注意的是,檢視原始碼中,just()中引數的個數最長到10個

from

Observable<String> testFrom = Observable.from(new String[]{"Hello","How are you?","yes,i\'m fine,thank you!"});

又如:

List<String> lists = new ArrayList<>();
lists.add("Hello");
lists.add("How are you?");
lists.add("yes,i'm fine,thank you!");
Observable<String> testFrom1 = Observable.from(lists);

from()支援從陣列或者是實現了Iterator介面的集合中接收引數,效果等同於上面的just()例子和create()方法。

just()和from()關係

寫看看原始碼。

public final static <T> Observable<T> just(T t1, T t2) {
        return from(Arrays.asList(t1, t2));
    }

當just引數在2個以上時,實際上內部呼叫的也是from(T[] array)方法。

好了,接下面的一part

Subscribe()其它形式

上一篇已經簡單進行了演示,當建立好一個Observable和一個Subcriber時,可以通過

mObservable.subscribe(mTestSubscriber);

繫結兩者,而subscribe()方法呼叫時,繫結在Observable物件mObservable中的OnSubscriber物件的onCall()方法就會處理,在onCall()方法中,mTestSubscriber可以呼叫onNext()或者onError()或者onCompleted()來完成整個事件鏈條。

但RxJava還提供其他的形式。比如Action

Action

先看api

public final Subscription subscribe(final Action1<? super T> onNext);

public final Subscription subscribe(final Action1<? super T> onNext, final Action1<Throwable> onError);

public final Subscription subscribe(final Action1<? super T> onNext, final Action1<Throwable> onError, final Action0 onComplete);

subscribe()可以傳入Action1或者Action0的引數。
先看Action1和Action0的原始碼。

/**
 * A one-argument action.
 */
public interface Action1<T> extends Action {
    void call(T t);
}

/**
 * A zero-argument action.
 */
public interface Action0 extends Action {
    void call();
}

註釋寫得很清楚,Action1代表一個引數action,Action0代表0個引數的Action.

那好,這裡檢視public final Subscription subscribe(final Action1

public final Subscription subscribe(final Action1<? super T> onNext) {
        if (onNext == null) {
            throw new IllegalArgumentException("onNext can not be null");
        }

        return subscribe(new Subscriber<T>() {

            @Override
            public final void onCompleted() {
                // do nothing
            }

            @Override
            public final void onError(Throwable e) {
                throw new OnErrorNotImplementedException(e);
            }

            @Override
            public final void onNext(T args) {
                onNext.call(args);
            }

        });
    }

顯而易見,這個方法中內部建立了一個subscriber物件,當onNext觸發時,呼叫傳入的Action1的物件的onCall方法。

其它的兩個方法,也是如此,這裡不再做分析。

總之,如果只關心onNext()事件,或者需要將onNext(),onError()或者onCompleted()由不同的物件處理,就可以考慮用Action的方式實現subscribe訂閱。

Action1<String> testAction = new Action1<String>() {
            @Override
            public void call(String s) {
                Toast.makeText(MainActivity.this,s,Toast.LENGTH_SHORT).show();
            }
        };
        mObservable.subscribe(testAction);

這相當於建立一個Subscriber物件,然後呼叫onNext()方法。

好了,這篇文章內容就到這裡。

回顧下:我們學習了基本的Observable和Subscriber的建立,訂閱。
也學會了它們其它形式如Just(),from(),Action()方式的實現。
雖然例子看起來沒有什麼用,但是這只是demo,一步一步來,後面有更多的知識點。