1.Observable、Observer、subscribe關係
public void testRxJava(){
//先創建一個被觀察者
Observable observable = Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(@NonNull ObservableEmitter<String> e) throws Exception {
/*1.ObservableEmitter: Emitter 是發射器的意思,這個就是用來發出事件的,它可以發出三種類型的事件,
通過調用emitter的 onNext(T value)、 onComplete()和 onError(Throwable error)。
2.請注意,
被觀察者可以發送無限個onNext, 觀察者也可以接收無限個onNext.
當被觀察者發送了一個onComplete後, 被觀察者onComplete之後的事件將會繼續發送, 而觀察者收到onComplete事件之後將不再繼續接收事件,同理onError也一樣
最爲關鍵的是onComplete和onError必須唯一併且互斥, 即不能發多個onComplete, 也不能發多個onError, 也不能先發一個onComplete, 然後再發一個onError*/
e.onNext("a");
}
});
//創建一個觀察者
Observer observer = new Observer<String>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
//dispose方法取消被觀察者和觀察者的訂閱關係
d.dispose();
}
@Override
public void onNext(@NonNull String s) {
Log.d("onNext",s);
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
}
};
//被觀察者和觀察者通過subscribe方法產生訂閱關係
observable.subscribe(observer);
}
2.Consumer
@Test
public void testConsumer(){
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(@NonNull ObservableEmitter<String> e) throws Exception {
e.onError(new RuntimeException("is null"));
//注意onNext方法不要傳包裝類,否則無法發射到觀察者
e.onNext("a");
}
}).subscribe(new Consumer<String>() {
@Override
public void accept(@NonNull String s) throws Exception {
//Consumer的accept()相當於Observer的OnNext()方法,別的事件不關心比如onError
Log.d("accept",s);
}
});
}
3.Schedulers
public void testSchedulers(){
Observable<String> observable = Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(@NonNull ObservableEmitter<String> e) throws Exception {
System.out.println(Thread.currentThread().getName());
e.onNext("a");
}
});
//1.subscribeOn() 指定的是被觀察者發送事件的線程, observeOn() 指定的是觀察者接收事件的線程.
/*2.Schedulers.io() 代表io操作的線程, 通常用於網絡,讀寫文件等io密集型的操作
Schedulers.computation() 代表CPU計算密集型的操作, 例如需要大量計算的操作
Schedulers.newThread() 代表一個常規的新線程
AndroidSchedulers.mainThread() 代表Android的主線程*/
observable.subscribeOn(AndroidSchedulers.mainThread());
observable.observeOn(Schedulers.newThread());
Observer observer = new Observer<String>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull String s) {
System.out.println(Thread.currentThread().getName());
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
}
};
observable.subscribe(observer);
}
4.Map
場景: 如果是一個新用戶, 必須先註冊, 等註冊成功之後再自動登錄該怎麼做呢.
很明顯, 這是一個嵌套的網絡請求, 首先需要去請求註冊, 待註冊成功回調了再去請求登錄的接口.
public void testMap(){
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(@NonNull ObservableEmitter<String> e) throws Exception {
e.onNext("a");
System.out.println("login");
}
//map是一個變換操作符, 它的作用就是對被觀察者發送的每一個事件都按照指定的函數去變化
}).map(new Function<String, String>() {
@Override
public String apply(@NonNull String s) throws Exception {
s = s+"a";
System.out.println("register");
return s;
}
}).subscribe(new Observer<String>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull String s) {
System.out.println(s);
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
}
});
}
5.FlatMap
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
emitter.onNext(1);
emitter.onNext(2);
emitter.onNext(3);
}
}).flatMap(new Function<Integer, ObservableSource<String>>() {
//這裏需要注意的是, flatMap並不保證事件的順序
@Override
public ObservableSource<String> apply(Integer integer) throws Exception {
final List<String> list = new ArrayList<>();
for (int i = 0; i < 3; i++) {
list.add("I am value " + integer);
}
return Observable.fromIterable(list).delay(10,TimeUnit.MILLISECONDS);
}
}).subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
Log.d(TAG, s);
}
});
6.ConcatMap
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
emitter.onNext(1);
emitter.onNext(2);
emitter.onNext(3);
}
}).concatMap(new Function<Integer, ObservableSource<String>>() {
//和flatMap的作用幾乎一模一樣, 只是它的結果是嚴格按照上游發送的順序來發送的
@Override
public ObservableSource<String> apply(Integer integer) throws Exception {
final List<String> list = new ArrayList<>();
for (int i = 0; i < 3; i++) {
list.add("I am value " + integer);
}
return Observable.fromIterable(list).delay(10,TimeUnit.MILLISECONDS);
}
}).subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
Log.d(TAG, s);
}
});
7ZIP
public void testZip(){
Observable observable1 = Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(@NonNull ObservableEmitter<String> e) throws Exception {
e.onNext("a");
}
});
Observable observable2 = Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(@NonNull ObservableEmitter e) throws Exception {
e.onNext("b");
}
});
//每發送一個, Zip就組合一個, 再將組合結果發送給Observer.
Observable.zip(observable1,observable2, new BiFunction<String,String,String>(){
@Override
public String apply(@NonNull String s, @NonNull String s2) throws Exception {
return s+s2;
}
}).subscribe(new Observer() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull Object o) {
System.out.print(o+"");
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
}
});
}