問題1:查看商品诲锹,先是獲取商品數(shù)據(jù),然后獲取評(píng)論惑折,然后授账。。惨驶。
解決手段:concat
詳解:
-
concat
:接收若干個(gè)Observables白热,將其組合并有序發(fā)射
代碼
private void pay() {
Observable.concat(getGoods(), getComment()).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Object>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull Object o) {
System.out.println(o.toString());
}
@Override
public void onError(@NonNull Throwable e) {
e.printStackTrace();
}
@Override
public void onComplete() {
}
});
}
private Observable<Object> getGoods() {
return Observable.create(new ObservableOnSubscribe<Object>() {
@Override
public void subscribe(@NonNull ObservableEmitter<Object> e) throws Exception {
// 獲取商品數(shù)據(jù)
System.out.println("獲取商品數(shù)據(jù)中");
Thread.sleep(3000);
e.onNext("我是商品數(shù)據(jù)");
// 注意,必須調(diào)用onComlete粗卜,否則下一個(gè)Observable不會(huì)執(zhí)行
e.onComplete();
}
});
}
private Observable<Object> getComment() {
return Observable.create(new ObservableOnSubscribe<Object>() {
@Override
public void subscribe(@NonNull ObservableEmitter<Object> e) throws Exception {
// 獲取商品評(píng)論
System.out.println("獲取商品評(píng)論中");
Thread.sleep(3000);
e.onNext("我是商品評(píng)論");
e.onComplete();
}
});
}
結(jié)果展示
結(jié)果展示
問題1.1:登錄屋确,獲取userID,然后根據(jù)ID去請(qǐng)求。攻臀。焕数。
解決手段:flatmap
詳解:
private void flatmap() {
login().flatMap(new Function<User, ObservableSource<Boolean>>() {
@Override
public ObservableSource<Boolean> apply(@NonNull User user) throws Exception {
System.out.println("用戶id" + user.uID);
return comment(user.uID);
}
}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<Boolean>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull Boolean o) {
System.out.println("評(píng)論" + o);
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
}
});
}
問題1.2:頁面數(shù)據(jù)需要請(qǐng)求幾個(gè)接口才能得到最終信息。刨啸。百匆。
解決手段:zip
詳解:
private void zip() {
Observable.zip(getComment(), getFromNet(), new BiFunction<Object, Integer, Object>() {
@Override
public Object apply(@NonNull Object o, @NonNull Integer integer) throws Exception {
System.out.println("中間合并分別是" + o.toString() + "和" + integer);
return o.toString() + integer;
}
}).subscribe(new Observer<Object>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull Object o) {
System.out.println("結(jié)果" + o);
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
}
});
}
結(jié)論:concat和merge都是兩個(gè)Observable組合,每發(fā)射一次就會(huì)回調(diào)一次呜投,zip就是兩個(gè)Observable組合等兩個(gè)Observable都發(fā)射了才會(huì)回調(diào)
問題2:展示一份數(shù)據(jù)加匈,數(shù)據(jù)來源有本地緩存以及網(wǎng)絡(luò)獲取,首先查看是否有緩存仑荐,沒有則使用網(wǎng)絡(luò)
解決手段:concat
雕拼、first
詳解:first
:只取第一個(gè)發(fā)射的數(shù)據(jù)
代碼
private void getData() {
Observable.concat(getFromCache(),getFromNet()).first(1).subscribeOn(Schedulers.io())
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe(new SingleObserver<Integer>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onSuccess(@NonNull Integer integer) {
}
@Override
public void onError(@NonNull Throwable e) {
}
});
}
private Observable<Integer> getFromCache() {
return Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(@NonNull ObservableEmitter<Integer> e) throws Exception {
if (hasCache) {
e.onNext(0);
}
e.onComplete();
}
});
}
private Observable<Integer> getFromNet() {
return Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(@NonNull ObservableEmitter<Integer> e) throws Exception {
if (!hasCache) {
Thread.sleep(3000);
e.onNext(1);
}
e.onComplete();
}
});
}
問題3:注冊(cè)頁面,需要所有信息填寫完整粘招,才能點(diǎn)擊注冊(cè)
解決手段:combineLatest
詳解:combineLatest()
作用于最近發(fā)射的數(shù)據(jù)項(xiàng):如果Observable1發(fā)射了A并且Observable2發(fā)射了B和C啥寇,combineLatest()將會(huì)分組處理AB和AC
combineLatest
代碼
Observable<CharSequence> observableName = RxTextView.textChanges(((TextView) findViewById(R.id.text)));
Observable<CharSequence> observablePwd = RxTextView.textChanges(((TextView) findViewById(R.id.text)));
Observable<Boolean> observableEnd = Observable.combineLatest(observableName, observablePwd, new BiFunction<CharSequence,CharSequence,Boolean>() {
@Override
public Boolean apply(@NonNull CharSequence charSequence, @NonNull CharSequence charSequence2) throws Exception {
return charSequence.length() > 0 && charSequence2.length() > 0;
}
});
問題4:數(shù)據(jù)源需要進(jìn)行篩選或者除null等過濾操作,不需要在結(jié)果再進(jìn)行篩選洒扎,更專注與業(yè)務(wù)
解決手段:filter
代碼
private void filter() {
Observable.fromArray("123","145",null,"3456").filter(new Predicate<String>() {
@Override
public boolean test(@NonNull String s) throws Exception {
// 這里會(huì)過濾掉null值已經(jīng)不是1開頭的字符串
return !TextUtils.isEmpty(s) && s.startsWith("1");
}
}).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() {
}
});
}