RxBinding实现用户注册验证

一,引入依赖

微信图片_20190515142625.png

二,设计布局
使用了TextInputLayout
微信图片_20190515143009.png
LinearLayout的约束布局比例

微信图片_20190515145037.png

三,代码实现

public class RegisterActivity extends AppCompatActivity {
      private volatile int regInfo = 1;
      @OnClick(R.id.backthis)
      public void backto() {
        finish();
      }
      @BindView(R.id.et_userNm)
      EditText et_userNm;
      @BindView(R.id.et_pwd)
      EditText et_pwd;
      @BindView(R.id.et_confimePwd)
      EditText et_confirmPwd;
      @BindView(R.id.btn_register)
      Button btn_register;
      @BindView(R.id.lay_userNm)
      TextInputLayout lay_userNm;
      @BindView(R.id.lay_pwd)
      TextInputLayout lay_pwd;
      @BindView(R.id.lay_confirmPwd)
      TextInputLayout lay_confirmPwd;
      @OnClick(R.id.btn_register)
      public void do_register(){
              /*此处省略提交网站Api写入数据库的逻辑*/

          Toast toast = Toast.makeText(RegisterActivity.this, "注册成功,即将跳转登录", Toast.LENGTH_SHORT);
          toast.setGravity(Gravity.CENTER,0,0);
          toast.show();
          //EventBus在此处发送RegIntoEntity,LoginActivity使用EventBus接受这个RegIntoEntity,并填充登录框
          EventBus.getDefault().post(new RegIntoEntity(et_userNm.getText().toString(),et_pwd.getText().toString()));
          //延迟2秒关闭 RegisterActivity
          Observable.timer(2, TimeUnit.SECONDS).subscribe(new Consumer<Long>() {
               @Override
               public void accept(Long aLong) throws Exception {
                      finish();
               }
          });
      }
      
      @SuppressLint("CheckResult")
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register);
        ButterKnife.bind(this);

        RxTextView.textChanges(et_userNm).subscribe(new Consumer<CharSequence>() {
            @Override
            public void accept(CharSequence charSequence) throws Exception {
                 if (!String.valueOf(charSequence).equals("")) {
                    if (!checkUserNm(String.valueOf(charSequence))) {
                        lay_userNm.setError("用户名仅能包含字母、数字、下划线,长度6-10位");
                    } else {
                        //异步验证用户名是否已被注册,并更新UI
                        validateUserNm(String.valueOf(charSequence));
                    }
                 } else {
                     lay_userNm.setError("");
                 }
            }
        });

        RxTextView.textChanges(et_pwd).subscribe(new Consumer<CharSequence>() {
            @Override
            public void accept(CharSequence charSequence) throws Exception {
                if (!String.valueOf(charSequence).equals("")) {
                    if (!checkPwd(String.valueOf(charSequence))) {
                        lay_pwd.setError("密码仅能包含字母、数字、下划线,长度6-12位");
                    } else {
                        lay_pwd.setError("");
                    }
                } else {
                    lay_pwd.setError("");
                }
            }
        });

        RxTextView.textChanges(et_confirmPwd).subscribe(new Consumer<CharSequence>() {
            @Override
            public void accept(CharSequence charSequence) throws Exception {
                if (!et_pwd.getText().toString().equals("")) {
                    if (!String.valueOf(charSequence).equals(et_pwd.getText().toString())) {
                        lay_confirmPwd.setError("两次输入密码不一致!");
                    } else {
                        lay_confirmPwd.setError("");
                    }
                } else {
                    lay_confirmPwd.setError("");
                }
            }
        });

        Observable
                .combineLatest(
                        RxTextView.textChanges(et_userNm).map(CharSequence::toString),
                        RxTextView.textChanges(et_pwd).map(CharSequence::toString),
                        RxTextView.textChanges(et_confirmPwd).map(CharSequence::toString),
                        new Function3<String, String, String, Boolean>(){
                            @Override
                            public Boolean apply(String s1, String s2,String s3) throws Exception {
                                return checkUserNm(s1) && checkPwd(s2) && checkConfirmPwd(s3);
                            }
                        }
                ).subscribe(new Consumer<Boolean>() {
                    @Override
                    public void accept(Boolean aBoolean) throws Exception {
                        if (aBoolean){
                            btn_register.setEnabled(true);
                        } else {
                            btn_register.setEnabled(false);
                        }
                    }
        });

    }

    private boolean checkUserNm (String strUserNm){
        //6-10个字符,至少1个字母和1个数字:
        return strUserNm.matches("^[a-z][a-zA-Z0-9]{5,9}$");
       
    }

    private boolean checkPwd (String strPwd){
        //6-12个字符,至少1个字母和1个数字:
        return strPwd.matches("^(?=.*[a-zA-Z])(?=.*\\d)[a-zA-Z\\d]{5,11}$");
    }

    private boolean checkConfirmPwd(String confirmPwd){
        return confirmPwd.equals(et_pwd.getText().toString());
    }

    private void validateUserNm(String loginName) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                OkHttpClient client = new OkHttpClient();
                JSONObject jsonObject = new JSONObject();
                try {
                    jsonObject.put("loginName",loginName);

                } catch (JSONException e) {
                    e.printStackTrace();
                }
                RequestBody body = RequestBody.create(WebUtil.mediaType, String.valueOf(jsonObject));
                Request request = new Request.Builder()
                        .url(WebUtil.BASEURL + WebUtil.checkUserNm)
                        .post(body)
                        .build();
                client.newCall(request).enqueue(new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {

                    }

                    @Override
                    public void onResponse(Call call, Response response) throws IOException {
                        if (response.isSuccessful()){
                            String result = response.body().string();
                            JSONObject jsonObject = null;
                            try {
                                jsonObject = new JSONObject(result);
                                regInfo = jsonObject.getInt("status");
                                if (regInfo == -1) {
                                    runOnUiThread(new Runnable() {
                                        @Override
                                        public void run() {
                                            lay_userNm.setError(loginName + "已被使用");
                                        }
                                    });
                                } else if (regInfo == 1){
                                    runOnUiThread(new Runnable() {
                                        @Override
                                        public void run() {
                                            lay_userNm.setError("");
                                        }
                                    });
                                }
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                });
            }
        }).start();
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值