单点登录时弹出全局重新登录提示dialog的思考

需求

在app开发过程中,我们通常会考遇到单点登录的问题,比如我们程序需要只能在一端登录,后面登录的会顶掉前面的登录. 此时需要我们在被顶掉之后,弹出dialog进行对用户的友好提示,并使用户点击后跳转到登录界面.由于有些程序没有通知类 的东西告诉你登录失效了,而我们程序则是在每个接口请求时检测用户信息,如果失效则返回指定的错误码.

问题

  1. dialog是在每个用到的地方定义一次还是只在用到的地方定义?
  2. dialog怎么弹出?假如多个接口同时返回错误码dialog如何只弹出一次?
  3. 错误码拦截如何处理?
  4. 如何跳转到登录界面?

思路

  1. 由于在登录之后所有错误码均有可能返回登录失效错误码,所以我们需要在网络请求后统一做判断处理,查看错误码是否是登录失效
  2. 由于dialog在登录失效时我们只需要弹出一次,无论有几个接口收到登录失效错误码.所以我么dialog的弹出需要做统一处理,而不是在每个错误码接收的地方都showDialog
  3. 由于在Application中跳转Activity如何解决

解决方案

目前我们的做法是,

  1. 在每一个接口请求处调用静态方法对错误码进行统一拦截
  2. 拦截到登录失效错误码时,我们用RXBus进行事件发送,
  3. 在Application中接收事件并判断dialog是否已经弹出,弹出不做处理,未弹出则才需要弹出dialog,避免dialog多次弹出问题
  4. 点击确定后发送事件到MainActivity也就是程序主界面,使其跳转到登录界面.(这里由于安卓各种问题,不能在Application中直接跳转到登录Activity)

代码演示

  1. 网络请求后,需要对返回码进行统一错误处理
if(ServerErrorUtil.isSuccess(data,true)){
    getView().getRoomInfoSucess(data.data);
}
复制代码
  1. 统一错误处理代码
public class ServerErrorUtil {
    public static boolean isSuccess(BaseResult baseResult, boolean isShowErrorMsg){
        return isSuccess(baseResult.msg,baseResult.status,isShowErrorMsg);
    }

    public static boolean isSuccess(String msg, int status, boolean isShowErrorMsg){
        if (status==1){//返回1则请求成功,服务器正常给返回数据
            return true;
        }else{
            //拦截指定错误码  目前还未有指定
            switch(status){
                case 2://登录过期
                case 3://其他设备登录
                    RxBus.getInstance().send(new LoginOutBus(msg));
                    isShowErrorMsg = false;//如果是登录问题,则弹出dialog提示不让下面的toast提示了
                    break;
            }
            //如果上层需要显示错误信息的话,则用固定的Toast来show错误消息
            if (isShowErrorMsg){
                ToastUtils.showLong(msg);
            }
            return false;
        }

    }
}
复制代码
  1. Application中接收RxBus消息
RxBus.getInstance()
    .toObserverable(LoginOutBus.class)
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Consumer<LoginOutBus>() {
        @Override
        public void accept(@NonNull LoginOutBus loginOutBus) throws Exception {
            if (isDialogShown) {
            } else {
                isDialogShown = true;
                builder = new DialogBuilder(app_activity).setTitle("提示")
                        .setMessage(loginOutBus.getMsg())
                        .setCancelable(false)
                        .setSimpleConfirmButton(com.zhiup.base.R.string.base_confirm, new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                RxBus.getInstance().send(new GoToLoginBus());
                            }
                        });

                builder.show();

        }
    }
});
复制代码
  1. 程序首界面接收到跳转消息后则执行跳转
//代码略
复制代码

转载于:https://juejin.im/post/5b6baf50f265da0f4e62ff5f

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值