RxJava學習筆記(一)
阿新 • • 發佈:2019-01-05
*** 學習參考部落格:
***
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物件:
2)Observable.just方法構造的Observable物件:由框架直接呼叫訂閱者實現的方法,依次呼叫onNext、onComplete(onNext執行成功)或onError(onNext執行失敗)
* 訂閱者的不同: 1)Subscriber<TestBean>物件例項:
2)Action1物件例項:不關注onComplete和onError的情況,call方法只對應onNext方法。
*Observable.create方法構造的Observable物件:
* Observable.just方法構造的Observable物件: