1.概念
compile 'io.reactivex.rxjava2:rxjava:2.0.6'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
查看rxandroid庫(kù),全部加起來(lái)大概三百行代碼,作用就是為android提供切換主線程此虑。(上面兩個(gè)不一定要一致,>2.0就可以口锭,rxandroid確實(shí)沒(méi)什么需要更新)
官方地址解釋:https://github.com/ReactiveX/RxJava
google翻譯一下:RxJava - JVM的反應(yīng)式擴(kuò)展 - 用于使用Java虛擬機(jī)的可觀察序列來(lái)編譯異步和基于事件的程序的庫(kù)朦前。
Rxjava的目的:解決基于異步介杆,基于事件的問(wèn)題
2.RxJava中的觀察者模式
觀察者模式(百科):觀察者模式定義了一種一對(duì)多的依賴關(guān)系,讓多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽某一個(gè)主題對(duì)象韭寸。這個(gè)主題對(duì)象在狀態(tài)上發(fā)生變化時(shí)春哨,會(huì)通知所有觀察者對(duì)象,使他們能夠自動(dòng)更新自己恩伺。
小生對(duì)觀察者模式的理解:
寫法一:Observable
就比如電視信號(hào)發(fā)射臺(tái)和電視機(jī)的關(guān)系赴背。
Observable :是被觀察者(電視信號(hào)發(fā)射臺(tái))的意思
Observer:就是觀察者(電視機(jī))
明白了吧,當(dāng)你收看某個(gè)電視臺(tái)時(shí)晶渠,就相當(dāng)于建立好了訂閱關(guān)系凰荚,發(fā)射臺(tái)往外發(fā)數(shù)據(jù),電視機(jī)接收數(shù)據(jù)進(jìn)行處理顯示褒脯,這個(gè)時(shí)候就是你看到的電視了便瑟。
注意:多個(gè)電視機(jī)收聽同一個(gè)電視臺(tái)。同理番川,觀察者可以是多個(gè)到涂。
寫法二:Flowable(2.0新增)
在RxJava 2.x中對(duì)于backpressure的處理進(jìn)行了改動(dòng),為此將原來(lái)的Observable拆分成了新的Observable和Flowable颁督。Flowable 中的操作符大多與舊有的 Observable 類似养盗。
增加特性:支持背壓
就比如在網(wǎng)頁(yè)上看視頻一樣,寫法一需要來(lái)一個(gè)數(shù)據(jù)處理一個(gè)數(shù)據(jù)适篙,但是我們不可能看視頻是根據(jù)你接收到多少就處理顯示多少,但是不收我就丟失了你這次的數(shù)據(jù)箫爷。這時(shí)背壓就相當(dāng)于我們的緩沖效果嚷节,數(shù)據(jù)可以發(fā),我也會(huì)收虎锚,解決了“發(fā)送速率>接收處理速率”的問(wèn)題硫痰。原來(lái)以什么樣的速度產(chǎn)生事件,現(xiàn)在還是什么樣的速度不會(huì)變化窜护,主要處理的是Subscriber接收事件的方式效斑。
Flowable:就是被觀察者(電視信號(hào)發(fā)射臺(tái))
Subscriber:就是觀察者(電視機(jī))
原理和上面一樣。
3.RxJava的配置使用
Observable寫法的簡(jiǎn)單使用(后續(xù)將會(huì)詳細(xì)講述更多簡(jiǎn)潔寫法)
原來(lái)的new Thread 異步線程:
···
new Thread() {
@Override
public void run() {
super.run();
SystemClock.sleep(2000);
new Handler().post(new Runnable() {
@Override
public void run() {
Log.i(TAG, "run: " + Thread.currentThread().getName());
}
});
}
}.start();
···
現(xiàn)在的Observable 異步寫法
Log.i(TAG, "run: " + Thread.currentThread().getName());
Observable.empty()
.doOnComplete(new Action() {
@Override
public void run() throws Exception {
Log.i(TAG, "run: " + Thread.currentThread().getName());
SystemClock.sleep(2000);
Log.i(TAG, "run: " + Thread.currentThread().getName());
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnComplete(new Action() {
@Override
public void run() throws Exception {
Log.i(TAG, "run: " + Thread.currentThread().getName());
}
})
.subscribe();
Observable 寫法打印結(jié)果
可以看到柱徙,很方便的實(shí)現(xiàn)了異步操作和線程切換缓屠。
Flowable寫法的簡(jiǎn)單使用(后續(xù)也將詳細(xì)講述)
Flowable 中的操作符大多與舊有的 Observable 類似。
實(shí)現(xiàn)簡(jiǎn)單異步代碼护侮,略
(上面Observable 異步寫法的代碼直接Observable改成Flowable 即可敌完。)
我就不拿上面的代碼再寫一遍了。
簡(jiǎn)單寫一個(gè)Flowable 事件分發(fā)背壓的寫法
//發(fā)射器
Flowable<String> flowable = Flowable.create(new FlowableOnSubscribe<String>() {
@Override
public void subscribe(FlowableEmitter<String> e) throws Exception {
String names[] = {"yangbin", "lizhangyan", "laopo", "laogong"};
for (String name : names) {
e.onNext(name);
}
e.onComplete();
}
}, BackpressureStrategy.BUFFER);
//接收器
Subscriber subscriber = new Subscriber<String>() {
@Override
public void onSubscribe(Subscription s) {
s.request(Long.MAX_VALUE);
}
@Override
public void onNext(String s) {
Log.i(TAG, "onNext: " + s);
}
@Override
public void onError(Throwable t) {
}
@Override
public void onComplete() {
Log.i(TAG, "onComplete: ");
}
};
flowable.subscribe(subscriber);
Flowable寫法打印結(jié)果
可以看到羊初,很方便的實(shí)現(xiàn)了事件的分發(fā)滨溉。
感謝您的瀏覽,更多寫法請(qǐng)看下期