柚子快報邀請碼778899分享:android RxJava
柚子快報邀請碼778899分享:android RxJava
一、RxJava簡介
1.RxJava
Reactive Extensions for the JVM,基于JVM的Rx。 Reactive Extensions(Rx)原來是由微軟提出的一個綜合了異步和基于事件驅動編程的庫。
RxJava的核心就是異步數據流和響應式編程: 1把所有的事件(數據)看成一條河流,它可以被觀察、過濾或操作,也可以和另外一條河流匯合成一條新的河流。 2一旦事件產生或發(fā)生變化,就可以觸發(fā)觀察這些事件的角色(觀察者/訂閱者)做出響應處理。
2.RxJava優(yōu)勢及適用場景
RxJava當然是優(yōu)秀而且強大的,有以下優(yōu)勢: 1具備響應式編程該有的特性。 2為異步而生,無需手動創(chuàng)建線程,并具備線程切換能力。 3支持鏈式調用,保證代碼的簡潔性。 4各種操作符,功能非常強大,滿足各種業(yè)務需求。 5簡化了異常的處理。 RxJava適用場景:網絡請求、數據庫讀寫、文件讀寫、定時任務等各種耗時操作需要通過異步來完成的操作都可以使用RxJava。
3.RxJava幾個重要概念
觀察者:Observer,觀察事件變化并處理的主要角色。消費者(Consumer)也可以理解成―種特殊的觀察者。 被觀察者:觸發(fā)事件并決定什么時候發(fā)送事件的主要角色。(異常和完成也是一種事件) 1Observable、Flowable、Single、Completable、Maybe都是被觀察者。 2Flowable是支持背壓的一種被觀察者。 3Single、Completable、Maybe是簡化版的Observable。 4幾種被觀察者通過toObservable/toFlowable/toSingle/toCompletable/toMaybe相互轉換。 訂閱(subscribe):觀察者和被觀察者建立關聯的操作。
二、RxJava實操
1.導庫
注:查找對應庫的地址: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
//事件產生的地方
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í)行結果: 注:onError與onComplete方法互斥,如果被觀察者兩個事件都包含,兩個事件都會被執(zhí)行,但是觀察者只能觀察到先執(zhí)行的那個事件。
3.create — 被觀察者與消費者
private void createOperatorTest() {
Observable.create(new ObservableOnSubscribe
@Override
public void subscribe(ObservableEmitter
//事件產生的地方
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í)行結果:
3.just — 被觀察者與觀察者
Just操作符最多能傳10個參數。
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í)行結果:
4.from
public static Observable fromArray(T… items); fromArray方法不限制傳入參數的個數,just方法內部也是使用的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í)行結果: public static Observable fromIterable(Iterable extends T> source); 可以傳入實現了Iterable接口的類型值。
ArrayList
list.add("msg_01");
list.add("msg_02");
list.add("msg_03");
Observable.fromIterable(list)
.subscribe(myObserver);
5.map
map: 對被觀察者傳入的事件進行處理,返回一個新的被觀察者。
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
多線程無序
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);
柚子快報邀請碼778899分享:android RxJava
精彩文章
本文內容根據網絡資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉載請注明,如有侵權,聯系刪除。