實現註冊登入你真的會了嗎

夜幕降流星雨發表於2017-12-19

使用Rxjava實現註冊登入你真的會了嗎

作為一名android開發者不得不說Rxjava真的很強大,強大的同時Rxjava的複雜也是讓大家頭疼。

自己寫了一個註冊登入的例子,通過這個例子我們需要知道Rxjava基本的使用方法,flatmap,do(doOnNext..),error(onErrorReturn..)等操作符的使用。

直接上程式碼

//reg() login() 登入註冊介面
reg().subscribeOn(Schedulers.io())//子執行緒中註冊
        .observeOn(AndroidSchedulers.mainThread())//主執行緒中處理註冊結果
        .doOnSubscribe(new Consumer<Disposable>() {//發起訂閱時回撥,可以彈出載入窗等操作
            @Override
            public void accept(Disposable disposable) throws Exception {
                Log.e(TAG, Thread.currentThread().getName() + " doOnSubscribe: ");

                loadDialog = ProgressDialog.
                        show(Day6Activity.this, "正在載入", "正在載入請耐心等待");
            }
        })
        .doOnNext(new Consumer<RegResponBean>() {//doOnNext(在onNext之前回撥)
            @Override
            public void accept(RegResponBean regResponBean) throws Exception {
                Log.e(TAG, Thread.currentThread().getName() + " doOnNext: ");

                if (regResponBean.isError()) {//拿出結果提示註冊是否成功
                    Toast.makeText(Day6Activity.this, "註冊失敗", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(Day6Activity.this, "註冊成功", Toast.LENGTH_SHORT).show();
                }
            }
        })
  		//onErrorReturn() 遇到異常可以捕獲到異常(異常被我們處理了不會走onError()
  		//並且可以在這裡提示註冊失敗,定義失敗的引數傳送出去
        .onErrorReturn(new Function<Throwable, RegResponBean>() {
            @Override
            public RegResponBean apply(Throwable throwable) throws Exception {
                Log.e(TAG, Thread.currentThread().getName() + " onErrorReturn: ");

                Toast.makeText(Day6Activity.this, "請求註冊介面失敗", Toast.LENGTH_SHORT).show();
                RegResponBean regResponBean = new RegResponBean();
                regResponBean.setError(true);
                return regResponBean;
            }
        })
        .observeOn(Schedulers.io())//註冊完成後進行登入,所以切換到子執行緒請求登入
  		//把註冊的結果轉化為登入請求
        .flatMap(new Function<RegResponBean, ObservableSource<?>>() {
            @Override
            public ObservableSource<?> apply(RegResponBean regResponBean) throws Exception {
                Log.e(TAG, Thread.currentThread().getName() + " flatMap: ");
				//當註冊介面的返回值提示失敗
              	 //當請求註冊介面失敗來自onErrorReturn()
                if (regResponBean.isError()) {
                  	//Observable.empty()相當於傳送onComplete事件
                    return Observable.empty();
                } else {
                    return login();//註冊成功,返回登入介面發起登入事件
                }
            }
        })
  		.observeOn(AndroidSchedulers.mainThread())//主執行緒中處理登入結果
                .doFinally(new Action() {//結束請求
                    @Override
                    public void run() throws Exception {
                        loadDialog.dismiss();
                        Log.e(TAG, Thread.currentThread().getName() + " doFinally: ");
                    }
                })
                .subscribe(new Consumer<Object>() {//登入成功
                    @Override
                    public void accept(Object o) throws Exception {
                        Log.e(TAG, Thread.currentThread().getName() + " onNext: ");
                        Toast.makeText(Day6Activity.this, "登入成功", Toast.LENGTH_SHORT).show();
                    }
                }, new Consumer<Throwable>() {//登入失敗
                    @Override
                    public void accept(Throwable throwable) throws Exception {
                        Log.e(TAG, Thread.currentThread().getName() + " onError: ");
                  	    Toast.makeText(Day6Activity.this, "請求登入介面失敗",
                                Toast.LENGTH_SHORT).show();       
                    }
                });
複製程式碼

tips:如果不需要判斷是那個介面請求失敗可以把onErrorReturn給去除掉

文章原地址,排版好很多,原諒我第一次用掘金寫東西

相關文章