flatMap 方法:
public final <R> Observable<R> flatMap(Function<? super T, ? extends ObservableSource<? extends R>> mapper) {
return flatMap(mapper, false);
}
flatmap 和 map 的區別:
從底層方法中可以看出,兩個方法返回值都是Observable;
不同點在於他們的Function接口中,flatmap輸出的是一個ObservaleSource 對象,而map方法輸出的是一個任意值
使用環境:
註冊成功後馬上調用登錄接口進行自動登錄
代碼示例:
註冊後登陸的案例,案例中的path要換位自己的path
1.1 工具方法(注意)
注意,以下三個方法爲工具方法
public static Observable getObservable(final String path) {
return Observable.create(new ObservableOnSubscribe<Response>() {
@Override
public void subscribe(@NonNull ObservableEmitter<Response> e) throws Exception {
OkHttpClient okHttpClient = new OkHttpClient.Builder().build();
Request request = new Request.Builder().url("http://192.168.1.66:8080/manager/" + path).build();
Response response = okHttpClient.newCall(request).execute();
e.onNext(response);
}
}).subscribeOn(Schedulers.io());
}
public static Observable getObservableTwo() {
return Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(@NonNull ObservableEmitter<String> e) {
e.onNext("發送第一個");
e.onNext("發送第二個");
}
}).subscribeOn(Schedulers.io());
}
public static Observable getObservableThere() {
return Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(@NonNull ObservableEmitter<String> e) {
e.onNext("我是第三個發射器,就只發送一個");
}
}).subscribeOn(Schedulers.io());
}
1.2 flatmap方法使用
getObservable("json.json") 爲註冊時候的請求,getObservable("two.json")爲登陸時候的請求;
public static void flatMap(final TextView textView) {
getObservable("json.json").observeOn(AndroidSchedulers.mainThread())
.doOnNext(new Consumer<Response>() {
@Override
public void accept(@NonNull Response response) throws Exception {
// Log.e("------->",response.body().string());
}
}).observeOn(Schedulers.io()) //指定接收器所在的線程
//flatmap,獲取上游返回值,根據當前返回值來判斷,是否是註冊成功了
.flatMap(new Function<Response, Observable<String>>() {
@Override
public Observable<String> apply(@NonNull Response response) throws Exception {
//如果註冊status狀態爲200,那麼接着登陸
if (new JSONObject(response.body().string()).get("status").equals("200")) {
return getObservable("two.json");
} else { //如果狀態值不爲200就返回null,或者其他值,這個由您自己定奪
return null;
}
}
}).observeOn(AndroidSchedulers.mainThread()) //切回主線程,可以update UI
.subscribe(new Consumer<Response>() { //對登陸狀態進行處理
@Override
public void accept(@NonNull Response response) throws Exception {
textView.setText(response.body().string() + "-----");
}
});
}