柚子快報(bào)邀請(qǐng)碼778899分享:android RxJava
柚子快報(bào)邀請(qǐng)碼778899分享:android RxJava
一、RxJava簡(jiǎn)介
1.RxJava
Reactive Extensions for the JVM,基于JVM的Rx。 Reactive Extensions(Rx)原來(lái)是由微軟提出的一個(gè)綜合了異步和基于事件驅(qū)動(dòng)編程的庫(kù)。
RxJava的核心就是異步數(shù)據(jù)流和響應(yīng)式編程: 1把所有的事件(數(shù)據(jù))看成一條河流,它可以被觀察、過(guò)濾或操作,也可以和另外一條河流匯合成一條新的河流。 2一旦事件產(chǎn)生或發(fā)生變化,就可以觸發(fā)觀察這些事件的角色(觀察者/訂閱者)做出響應(yīng)處理。
2.RxJava優(yōu)勢(shì)及適用場(chǎng)景
RxJava當(dāng)然是優(yōu)秀而且強(qiáng)大的,有以下優(yōu)勢(shì): 1具備響應(yīng)式編程該有的特性。 2為異步而生,無(wú)需手動(dòng)創(chuàng)建線程,并具備線程切換能力。 3支持鏈?zhǔn)秸{(diào)用,保證代碼的簡(jiǎn)潔性。 4各種操作符,功能非常強(qiáng)大,滿足各種業(yè)務(wù)需求。 5簡(jiǎn)化了異常的處理。 RxJava適用場(chǎng)景:網(wǎng)絡(luò)請(qǐng)求、數(shù)據(jù)庫(kù)讀寫(xiě)、文件讀寫(xiě)、定時(shí)任務(wù)等各種耗時(shí)操作需要通過(guò)異步來(lái)完成的操作都可以使用RxJava。
3.RxJava幾個(gè)重要概念
觀察者:Observer,觀察事件變化并處理的主要角色。消費(fèi)者(Consumer)也可以理解成―種特殊的觀察者。 被觀察者:觸發(fā)事件并決定什么時(shí)候發(fā)送事件的主要角色。(異常和完成也是一種事件) 1Observable、Flowable、Single、Completable、Maybe都是被觀察者。 2Flowable是支持背壓的一種被觀察者。 3Single、Completable、Maybe是簡(jiǎn)化版的Observable。 4幾種被觀察者通過(guò)toObservable/toFlowable/toSingle/toCompletable/toMaybe相互轉(zhuǎn)換。 訂閱(subscribe):觀察者和被觀察者建立關(guān)聯(lián)的操作。
二、RxJava實(shí)操
1.導(dǎo)庫(kù)
注:查找對(duì)應(yīng)庫(kù)的地址:https://mvnrepository.com/
// https://mvnrepository.com/artifact/io.reactivex.rxjava2/rxjava
implementation 'io.reactivex.rxjava2:rxjava:2.2.21'
// https://mvnrepository.com/artifact/io.reactivex.rxjava2/rxandroid
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
2.create — 被觀察者與觀察者
private void createOperatorTest() {
Observable.create(new ObservableOnSubscribe
@Override
public void subscribe(ObservableEmitter
//事件產(chǎn)生的地方
emitter.onNext("Observable test_01");
emitter.onNext("Observable test_02");
emitter.onNext("Observable test_03");
//emitter.onError(new Throwable("Manual Error!"));
emitter.onComplete();
}
}).subscribe(new Observer
@Override
public void onSubscribe(Disposable d) {
System.out.println("Observer onSubscribe");
}
@Override
public void onNext(Object o) {
System.out.println("Observer onNext o: " + o);
}
@Override
public void onError(Throwable e) {
System.out.println("Observer onError: " + e.toString());
}
@Override
public void onComplete() {
System.out.println("Observer onComplete");
}
});
}
執(zhí)行結(jié)果: 注:onError與onComplete方法互斥,如果被觀察者兩個(gè)事件都包含,兩個(gè)事件都會(huì)被執(zhí)行,但是觀察者只能觀察到先執(zhí)行的那個(gè)事件。
3.create — 被觀察者與消費(fèi)者
private void createOperatorTest() {
Observable.create(new ObservableOnSubscribe
@Override
public void subscribe(ObservableEmitter
//事件產(chǎn)生的地方
emitter.onNext("Observable test_01");
emitter.onNext("Observable test_02");
emitter.onNext("Observable test_03");
// emitter.onComplete();
emitter.onError(new Throwable("Manual Error!"));
}
}).subscribe(new Consumer
@Override
public void accept(Object o) throws Exception {
System.out.println("Consumer o: " + o);
}
}, new Consumer
@Override
public void accept(Throwable throwable) throws Exception {
System.out.println("Consumer
}
});
}
執(zhí)行結(jié)果:
3.just — 被觀察者與觀察者
Just操作符最多能傳10個(gè)參數(shù)。
private void justOperatorTest(){
Observable.just("msg_01", "msg_02", "msg_03")
.subscribe(new Observer
@Override
public void onSubscribe(Disposable d) {
System.out.println("Observer onSubscribe");
}
@Override
public void onNext(Object o) {
System.out.println("Observer onNext o: " + o);
}
@Override
public void onError(Throwable e) {
System.out.println("Observer onError: " + e.toString());
}
@Override
public void onComplete() {
System.out.println("Observer onComplete");
}
});
}
執(zhí)行結(jié)果:
4.from
public static Observable fromArray(T… items); fromArray方法不限制傳入?yún)?shù)的個(gè)數(shù),just方法內(nèi)部也是使用的fromArray。
Observable.fromArray("msg_01", "msg_02", "msg_03", "msg_04", "msg_05", "msg_06", "msg_07", "msg_08", "msg_09", "msg_10", "msg_11")
.subscribe(myObserver);
執(zhí)行結(jié)果: public static Observable fromIterable(Iterable extends T> source); 可以傳入實(shí)現(xiàn)了Iterable接口的類(lèi)型值。
ArrayList
list.add("msg_01");
list.add("msg_02");
list.add("msg_03");
Observable.fromIterable(list)
.subscribe(myObserver);
5.map
map: 對(duì)被觀察者傳入的事件進(jìn)行處理,返回一個(gè)新的被觀察者。
Observable.just("msg_01", "msg_02")
.map(new Function
@Override
public Object apply(String s) throws Exception {
System.out.println("Function apply " + s);
return "fun_msg";
}
}).subscribe(myObserver);
6.flatMap
多線程無(wú)序
Observable.just("msg_01", "msg_02")
.flatMap(new Function
@Override
public ObservableSource> apply(String s) throws Exception {
System.out.println("Function apply " + s);
return Observable.just("apply_msg_01", "apply_msg_02");
}
}).subscribe(myObserver);
7.concatMap
有序
Observable.just("msg_01", "msg_02")
.concatMap(new Function
@Override
public ObservableSource> apply(String s) throws Exception {
System.out.println("Function apply " + s);
return Observable.just("apply_msg_01", "apply_msg_02");
}
}).subscribe(myObserver);
8.buffer
Observable.just("msg_01", "msg_02", "msg_03",
"msg_04", "msg_05", "msg_06", "msg_07")
.buffer(3).subscribe(myObserver);
柚子快報(bào)邀請(qǐng)碼778899分享:android RxJava
精彩文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。