实现注册登录你真的会了吗

619 阅读2分钟

使用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给去除掉

文章原地址,排版好很多,原谅我第一次用掘金写东西