安卓小白一枚,剛開(kāi)始研究 RxJava铺遂,隨手記錄衫哥,過(guò)于基礎(chǔ)的內(nèi)容,新學(xué)習(xí)的小伙伴一起討論襟锐,大神輕拍撤逢,有不對(duì)的地方感謝指導(dǎo),立馬整改!
無(wú)聊的前篇
一直都知道有RxJava這么個(gè)東西蚊荣,也知道很好用初狰。但是手里的都是遺留下來(lái)的老項(xiàng)目,沒(méi)有用到互例,也沒(méi)有研究奢入,最近有點(diǎn)時(shí)間,趕緊惡補(bǔ)一下媳叨。
更無(wú)聊的基礎(chǔ)概念 :
- 什么是RxJava腥光?(似乎只有我自己不知道--!!!)
說(shuō)白了就是Rx 的 Java的實(shí)現(xiàn)。什么是Rx糊秆?就是 Reactive Extensions的縮寫(xiě)武福。Reactive Extensions又是什么呢?英語(yǔ)小白的我趕緊翻開(kāi)已經(jīng)落了一層厚厚的灰的《牛津高階英漢詞典》@┤弧(對(duì)艘儒,我什么方面都是小白!我超白7蚺肌)中文意思是 響應(yīng)式擴(kuò)展界睁。意思就是......emmmmm......
我們看官方介紹吧(--|||)
好了,這里就應(yīng)該知道RxJava的概念了吧! (然而我是一臉懵 B~)
好吧, 概念解釋什么的官方說(shuō)的很官方~
各路大神也能夠給出特別好的介紹, 我這么白就不BB了!
上干貨!!!
RxJava的基礎(chǔ)實(shí)現(xiàn)
- 配置 Android studio 的 gradle:
dependencies {
......
implementation "io.reactivex.rxjava2:rxjava:2.2.3"
implementation "io.reactivex.rxjava2:rxandroid:2.1.0"
}
RxAndroid: RxJava 在Android 平臺(tái)的擴(kuò)展, 里面有Android 相關(guān)的一些工具 .
- 使用:
最基本的需要3步:
- 創(chuàng)建觀察者(Observer)
- 創(chuàng)建被觀察者(Observable)
- 訂閱(Subscribe)
有沒(méi)有很眼熟! 觀察者模式么不就是! 對(duì),就醬!
開(kāi)始操刀!!!!
1. 創(chuàng)建觀察者(Observer)
Observer<Object> observer = new Observer<Object>() {
private Disposable disposable;// 用來(lái)解除訂閱
@Override
public void onSubscribe(Disposable d) {
// 回調(diào)方法onSubscribe,傳遞參數(shù)為Disposable 兵拢,
// Disposable相當(dāng)于RxJava1.x中的Subscription,用于解除訂閱
disposable = d;
}
@Override
public void onNext(Object o) {
// TODO 觀察者普通事件翻斟,把要處理的事件添加到事件隊(duì)列中去
Log.d(TAG, o.toString());
}
@Override
public void onError(Throwable e) {
// TODO 異常事件,當(dāng)發(fā)生異常時(shí)調(diào)用说铃,同時(shí)隊(duì)列終止访惜,不再發(fā)出事件
Log.d(TAG, e.getMessage());
}
@Override
public void onComplete() {
// TODO 隊(duì)列事件結(jié)束,當(dāng)隊(duì)列中不再有新的事件產(chǎn)生時(shí)腻扇,觸發(fā)债热,作為結(jié)束標(biāo)志
Log.d(TAG, "OnComplete");
}
};
其中有一個(gè)Disposable的對(duì)象,用來(lái)解除訂閱,只要在想要的位置添加
disposable.dispose();
就可以了.
2. 創(chuàng)建被觀察者(Observable)
Observable observable = Observable.create(new ObservableOnSubscribe<Object>() {
@Override
public void subscribe(ObservableEmitter<Object> emitter) throws Exception {
emitter.onNext("第一個(gè)數(shù)據(jù)");
emitter.onNext("第二個(gè)數(shù)據(jù)");
emitter.onComplete();
}
});
lambda一下:
Observable observable = Observable.create(emitter -> {
emitter.onNext("第一個(gè)數(shù)據(jù)");
emitter.onNext("第二個(gè)數(shù)據(jù)");
emitter.onComplete();
});
這是Observable.create() 添加事件, 還可以用just:
Observable observable1 = Observable.just("第一個(gè)數(shù)據(jù)", "第二個(gè)數(shù)據(jù)");
還可以用 fromArray :
String[] words = {"第一個(gè)數(shù)據(jù)", "第二個(gè)數(shù)據(jù)"};
Observable observable2 = Observable.fromArray(words);
你想要的,我都給你(^3^)
3. 訂閱(Subscribe)
這個(gè)只要一行代碼:
observable.subscribe(observer);
運(yùn)行結(jié)果:
結(jié)合
仔細(xì)看第三步訂閱,不就是 subscribe 把觀察者和被觀察者連在一起嗎.
有了這跟紅線,觀察者和被觀察者快(mei)樂(lè)(xiu)幸(mei)福(sao)的在一起后:
Observable.create(emitter ->{
emitter.onNext("第一個(gè)數(shù)據(jù)");
emitter.onNext("第二個(gè)數(shù)據(jù)");
emitter.onComplete();
}).subscribe(new Observer<Object>() {
private Disposable disposable;// 用來(lái)解除訂閱
@Override
public void onSubscribe(Disposable d) {
// 回調(diào)方法onSubscribe,傳遞參數(shù)為Disposable 幼苛,
// Disposable相當(dāng)于RxJava1.x中的Subscription,用于解除訂閱
disposable = d;
}
@Override
public void onNext(Object o) {
// TODO 觀察者普通事件窒篱,把要處理的事件添加到事件隊(duì)列中去
Log.d(TAG, o.toString());
}
@Override
public void onError(Throwable e) {
// TODO 異常事件,當(dāng)發(fā)生異常時(shí)調(diào)用舶沿,同時(shí)隊(duì)列終止墙杯,不再發(fā)出事件
Log.d(TAG, e.getMessage());
}
@Override
public void onComplete() {
// TODO 隊(duì)列事件結(jié)束,當(dāng)隊(duì)列中不再有新的事件產(chǎn)生時(shí)括荡,觸發(fā)高镐,作為結(jié)束標(biāo)志
Log.d(TAG, "OnComplete");
}
});
好了圓滿了,就醬!!
然而
翻了資料看到還有一個(gè)問(wèn)題:
觀察者還有一種方式:
Subscriber<String> subscriber = new Subscriber<String>() {
@Override
public void onSubscribe(Subscription s) {
//這一步是必須,我們通郴澹可以在這里做一些初始化操作嫉髓,調(diào)用request()方法表示初始化工作已經(jīng)完成
//調(diào)用request()方法观腊,會(huì)立即觸發(fā)onNext()方法
s.request(Long.MAX_VALUE);//這里是請(qǐng)求數(shù)量,如果沒(méi)有要求可以寫(xiě)Long.MAX_VALUE算行,請(qǐng)求足夠多的事件
//在onComplete()方法完成恕沫,才會(huì)再執(zhí)行request()后邊的代碼
}
@Override
public void onNext(String s) {
// TODO 觀察者普通事件,把要處理的事件添加到事件隊(duì)列中去
Log.d(TAG, s);
}
@Override
public void onError(Throwable t) {
// TODO 異常事件纱意,當(dāng)發(fā)生異常時(shí)調(diào)用,同時(shí)隊(duì)列終止鲸阔,不再發(fā)出事件
Log.d(TAG, t.getMessage());
}
@Override
public void onComplete() {
// TODO 隊(duì)列事件結(jié)束偷霉,當(dāng)隊(duì)列中不再有新的事件產(chǎn)生時(shí),觸發(fā)褐筛,作為結(jié)束標(biāo)志
Log.d(TAG, "OnComplete");
}
};
同樣的訂閱:
observable.subscribe(subscriber);
然后就
沒(méi)有Subscriber 對(duì)象,說(shuō)好了做彼此的好基友呢?為啥不要我了!!
但是有的時(shí)候變的往往是我們自己
上源碼大法!
RxJava 1.0
public abstract class Subscriber<T> implements Observer<T>, Subscription {...}
RxJava 2.0
public interface Subscriber<T> {...}
RxJava 2.0 已經(jīng)按照Reactive-Streams specification規(guī)范完全的重寫(xiě)了类少。RxJava2.0 已經(jīng)獨(dú)立于RxJava 1.x而存在。還想著向下兼容的好事兒呢?!呵呵~~~
那么我Subscriber 就孤獨(dú)沒(méi)人要了嗎?當(dāng)讓不是.
在RxJava2.0中增加被觀察者的新實(shí)現(xiàn):Flowable 而且支持背壓呀有木有!
具體的使用和 Observable Observer的組合基本一樣:
//觀察者
ResourceSubscriber<String> subscriber = new ResourceSubscriber<String>() {
@Override
public void onStart() {
request(Long.MAX_VALUE);//這里是請(qǐng)求數(shù)量渔扎,如果沒(méi)有要求可以寫(xiě)Long.MAX_VALUE,請(qǐng)求足夠多的事件
}
@Override
public void onNext(String s) {
// TODO 觀察者普通事件晃痴,把要處理的事件添加到事件隊(duì)列中去
Log.d(TAG, s);
}
@Override
public void onError(Throwable t) {
// TODO 異常事件残吩,當(dāng)發(fā)生異常時(shí)調(diào)用,同時(shí)隊(duì)列終止倘核,不再發(fā)出事件
Log.d(TAG, t.getMessage());
}
@Override
public void onComplete() {
// TODO 隊(duì)列事件結(jié)束泣侮,當(dāng)隊(duì)列中不再有新的事件產(chǎn)生時(shí),觸發(fā)紧唱,作為結(jié)束標(biāo)志
Log.d(TAG, "OnComplete");
}
};
//可觀察者活尊,和被觀察者一樣的
Flowable flowable = Flowable.create((FlowableOnSubscribe<String>) emitter -> {
emitter.onNext("第一個(gè)數(shù)據(jù)");
emitter.onNext("第二個(gè)數(shù)據(jù)");
emitter.onComplete();
}, BackpressureStrategy.BUFFER);// 多了一個(gè)參數(shù)
//訂閱
flowable.subscribe(subscriber);
//取消訂閱
subscriber.dispose();
然后看一眼ResourceSubscriber是啥:
public abstract class ResourceSubscriber<T> implements FlowableSubscriber<T>, Disposable {....}
再看一眼FlowableSubscriber :
public interface FlowableSubscriber<T> extends SubscSriber<T> {...}
看到?jīng)]! 我Subscriber! 穿上美麗的裙子,變成了ResourceSubscriber!!!嫁給了王子!!!(總覺(jué)得哪里不對(duì)...Observable 和 SubscSriber是曾經(jīng)的基友...穿裙子...嫁給王子...)理不清了,不管了!
只是想說(shuō)一句,現(xiàn)在的搜索引擎...emmmm...優(yōu)秀!!!!
上面就是最基本的RxJava的使用了,后續(xù)再學(xué)習(xí)再更新!!!
(某大神: 這么簡(jiǎn)單的東西也要寫(xiě)hetui~)