rxjava2.0第三篇之flatMap使用
阿新 • • 發佈:2018-12-10
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() + "-----"); } }); }