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,一步一步來,後面有更多的知識點。