1. 程式人生 > >RxJava學習筆記(一)

RxJava學習筆記(一)

*** 學習參考部落格: *** 1、在gradle中新增,載入RxJava框架: compile 'io.reactivex:rxjava:1.1.2' 2、RxJava中主要涉及兩個類: 被觀察者類(可觀察):Observable<T> 訂閱者(事件)類:Observer<T>、Subscriber<T>(或者使用Action1) 3、使用說明: 觀察者物件通過訂閱訂閱者物件來觸發訂閱者的回撥事件。 4、被觀察者初始化方式: 被觀察者有多種初始化方式,一種是直接覆寫call方法,在call方法裡呼叫訂閱物件的三個函式 (onNext、onComplete、onError),並將回撥函式中需要的值物件直接賦值傳遞,如: 法一:
Observable<TestBean> mObservable2 = Observable.create( new Observable.OnSubscribe<TestBean>() { /** * @param subscriber 訂閱者 */ @Override public void call(Subscriber<? super TestBean> subscriber) { //根據call裡的next、complete、error呼叫的順序呼叫,但呼叫順序有講究 //在若先呼叫error,則next和complete兩者都不呼叫,若complete呼叫在next之前,則next不呼叫 //若call中任何都不呼叫,則三個函式都不執行 subscriber.onNext(bean1); subscriber.onCompleted(); subscriber.onError(new AndroidException()); } }); 法二:
//此種方式,由RxJava框架呼叫依次呼叫next、complete、error, //若正常呼叫complete,則error不再執行。 Observable<TestBean> mObservable1 = Observable.just(bean1, bean2, bean3, bean4); 法三: //呼叫from的方法本質和just一致,都是依次傳送,只是傳入的形參不同 TestBean[] list = { new TestBean(), new TestBean(), new TestBean(), new TestBean() }; Observable<TestBean> mBeanObservable = Observable.from(list); 5、訂閱者三種實現方式:
法一: 直接建立訂閱類的物件,需要覆寫三個函式,分別對應訂閱時、訂閱完成成功、訂閱完成失敗,相比法三,多了一個onStart方法,這個方法將在onNext執行前呼叫,做一些準備工作,比如初始化onNext中需要的物件或資料 /** * 訂閱者物件,執行的動作 */ Subscriber<TestBean> mSubscriber = new Subscriber<TestBean>() { @Override public void onStart() { //在事件傳送前(呼叫onNext方法前呼叫) Log.i("Subscriber 訂閱者", "onStart()"); } @Override public void onCompleted() { Log.i("Subscriber 訂閱者", "onCompleted()"); } @Override public void onError(Throwable e) { Log.i("Subscriber 訂閱者", "onError(Throwable e)"); } @Override public void onNext(TestBean testBean) { Log.i("Subscriber 訂閱者", "onNext(TestBean testBean),testBean的值為:" + testBean.i); } }; 法二: 不關注訂閱操作結果onComplete和onError這兩個回撥,可以直接使用Action1(Action0, Action2等,Action後面接的數字代表了call方法中引數的個數,引數的型別可以在定義時指定)來建立訂閱物件: /** * 當Subscriber訂閱者物件不關注complete和error兩種情況時 * 可以採用Action1來取代Subscriber物件執行回撥 * Action1是RxJava框架中的一個抽象類 * 呼叫如: * mObservable1.subscribe(onNextAction); */ Action1<TestBean> onNextAction = new Action1<TestBean>() { @Override public void call(TestBean s) { Log.i("使用Action1呼叫:", "call(TestBean s)"); } }; 法三: 這個方法的本質其實也是法一的用法,框架會將Observer包裝成Subscribe物件 /** * 觀察者 */ Observer<TestBean> mObserver = new Observer<TestBean>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(TestBean testBean) { } }; 6、被觀察者通知訂閱者並觸發事件 mObservable1.subscribe(mSubscriber); mObservable2.subscribe(onNextAction); 注意:被觀察者和訂閱者在建立時指定的泛型物件必須一致,否則編譯時不會通過的。 (此處省掉Observable和Subscribe的例項化操作,看官自行例項化) * 訂閱事件,通知觸發訂閱事件: Observable<TestBean> mObservable1; Subscriber<TestBean> mSubscriber1; mObservable1.subscribe(mSubscriber1); Observable<String> mObservable2; Subscriber<String> mSubscriber2; mObservable2.subscribe(mSubscriber2); * 取消訂閱: 在取消訂閱前,可以先呼叫mSubscriber1.isUnsubscribe();判斷是否有訂閱 mSubscriber1.unsubscribe(); mSubscriber2.unsubscribe(); 取消訂閱後不再接受監聽者發來的事件,並能避免由於Observable物件持有subscribe物件導致的記憶體洩露。 7、使用不同方式建立Observable物件和不同的訂閱者不同的呼叫過程: 被觀察者的subscribe方法繫結訂閱者會觸發訂閱者的事件 但要分情況說明: * 觀察者的構建的不同: 1)Observable.create方法構造的Observable物件:先觸發自身覆寫的call函式,再根據subscriber物件方法的呼叫去呼叫訂閱者的方法
2)Observable.just方法構造的Observable物件:由框架直接呼叫訂閱者實現的方法,依次呼叫onNext、onComplete(onNext執行成功)或onError(onNext執行失敗)
* 訂閱者的不同: 1)Subscriber<TestBean>物件例項:
2)Action1物件例項:不關注onComplete和onError的情況,call方法只對應onNext方法。
*Observable.create方法構造的Observable物件:
* Observable.just方法構造的Observable物件: