1. 程式人生 > >rxjava2.0第三篇之flatMap使用

rxjava2.0第三篇之flatMap使用

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() + "-----");
                    }
                });
    }