RxJava學習筆記
#### 1.什麼是RxJava
一個實現異步操作的庫
RxJava依賴:
compile 'io.reactivex.rxjava2:rxjava:2.0.1'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
2.RxJava的好處
隨着程序邏輯變得越來越複雜,它依然能夠保持簡潔。
3.RxJava 的觀察者模式
RxJava有四個觀察者模式 :
3.1基本概念
Observable
(被觀察者)
Observer
(觀察者)
subscribe
(訂閱)、事件。
Observable 和
Observer 通過
subscribe() 方法實現訂閱關係,從而
Observable 可以在需要的時候發出事件來通知
Observer`。
3.2事件回調的三種方式
onNext() 普通的回調方法
onCompleted() 發出事件的集合
onError() 事件中的異常時調用 同時會終止事件發送
總結: onCompleted()和onError()在一個隊列中只能存在其中一種,並且在隊列末端.觀察者接收到其中一個回調之後就會停止接收事件.
3.3 Observer的基本使用
除了Observer的接口外,另外還有一個抽象類對其進行擴展:Subscriber 基本使用都一樣
創建方法:
Subscriber subscriber = new Subscriber() {
public void onNext(String s) {
}
public void onCompleted() {
}
public void onError(Throwable e) {
}
};
帶有一個
Consumer
參數的方法表示下游只關心onNext事件, 其他的事件我假裝沒看見, 因此我們如果只需要onNext事件可以這麼寫://訂閱觀察者 subscribe(new Consumer<Integer>() { @Override public void accept(Integer integer) throws Exception { Log.d(TAG, "onNext: " + integer); }
Subscriber的不同
onStart() 在事件開始之前調用 可以用作數據的清理和重置 但不能做耗時操作, 可以使用 doOnsubscrible方法進行耗時操作
unsubscribe() 取消訂閱的方法, 在此方法調用前可以使用isUnsubscribe進行狀態判斷,要注意關閉訂閱,以免發生內存泄露
3.4 Observable的基本使用
Observable observable = Observable.create(new Observable.OnSubscribe() {
@Override
public void call(Subscriber
//字符串的傳遞
//創建一個被觀察者
Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
//需要傳遞的對象
observer.onNext("cccc");
}
//訂閱觀察者
}).subscribe(new Observer<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
//接收傳遞的對象
}
});
上面兩個例子都是在同一線程中執行.
4.線程控制器 Scheduler
RxJava通過它來指定每一段代碼應該運行在怎樣的線程,RxJava內置一下幾種控制器:
Schedulers.immediate()
: 直接在當前線程運行,相當於不指定線程。這是默認的Scheduler
。Schedulers.newThread()
: 總是啓用新線程,並在新線程執行操作Schedulers.io()
: I/O 操作(讀寫文件、讀寫數據庫、網絡信息交互等)所使用的Schedulers.computation()
: 計算所使用的Scheduler
。這個計算指的是 CPU 密集型計算,即不會被 I/O 等操作限制性能的操作,例如圖形的計算。這個Scheduler
使用的固定的線程池,大小爲 CPU 核數。不要把 I/O 操作放在computation()
中,否則 I/O 操作的等待時間會浪費 CPU。另外, Android 還有一個專用的
AndroidSchedulers.mainThread()
,它指定的操作將在 Android 主線程運行。有了這幾個
Scheduler
,就可以使用subscribeOn()
和observeOn()
兩個方法來對線程進行控制了。subscribeOn()
: 指定subscribe()
所發生的線程,即Observable.OnSubscribe
被激活時所處的線程。或者叫做事件產生的線程。observeOn()
: 指定Subscriber
所運行在的線程。或者叫做事件消費的線程。//線程切換演示 Observable.just(1,2,3) .subscribeOn(Schedulers.io()) //讓事件在子線程在子線程執行 .observeOn(AndroidSchedulers.mainThread()) //觀察者返回主線程執行 .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Toast.makeText(MainActivity.this, "出來了", Toast.LENGTH_SHORT).show(); } });
4.1 操作符
所謂變換,就是將事件序列中的對象或整個序列進行加工處理,轉換成不同的事件或事件序列
- map轉化符 : 可以轉換髮送數據的類型.
//變換的演示
Observable.just("圖片地址")
.map(new Func1<String, Bitmap>() {
@Override
public Bitmap call(String s) {
//調用方法把字符串轉化圖片
return ;
}
})
.subscribe(new Action1<Bitmap>() {
@Override
public void call(Bitmap bitmap) {
//顯示圖片
}
});
- flatMap :將一個發送事件的上游Observable變換爲多個發送事件的Observables,然後將它們發射的事件合併後放進一個單獨的Observable裏.
Zip
通過一個函數將多個Observable發送的事件結合到一起,然後發送這些組合到一起的事件. 它按照嚴格的順序應用這個函數。它只發射與發射數據項最少的那個Observable一樣多的數據。- sample : 個操作符每隔指定的時間就從上游中取出一個事件發送給下游. 這裏我們讓它每隔2秒取一個事件給下游, 來看看這次的運行結果吧:
5 .Disposable對象
當調用它的dispose()
方法時, 它就會將兩根管道切斷, 從而導致下游收不到事件.
注意: 調用dispose()並不會導致上游不再繼續發送事件, 上游會繼續發送剩餘的事件
那如果有多個Disposable
該怎麼辦呢, RxJava中已經內置了一個容器CompositeDisposable
, 每當我們得到一個Disposable
時就調用CompositeDisposable.add()
將它添加到容器中, 在退出的時候, 調用CompositeDisposable.clear()
即可切斷所有的水管.