需求
在app开发过程中,我们通常会考遇到单点登录的问题,比如我们程序需要只能在一端登录,后面登录的会顶掉前面的登录. 此时需要我们在被顶掉之后,弹出dialog进行对用户的友好提示,并使用户点击后跳转到登录界面.由于有些程序没有通知类 的东西告诉你登录失效了,而我们程序则是在每个接口请求时检测用户信息,如果失效则返回指定的错误码.
问题
- dialog是在每个用到的地方定义一次还是只在用到的地方定义?
- dialog怎么弹出?假如多个接口同时返回错误码dialog如何只弹出一次?
- 错误码拦截如何处理?
- 如何跳转到登录界面?
思路
- 由于在登录之后所有错误码均有可能返回登录失效错误码,所以我们需要在网络请求后统一做判断处理,查看错误码是否是登录失效
- 由于dialog在登录失效时我们只需要弹出一次,无论有几个接口收到登录失效错误码.所以我么dialog的弹出需要做统一处理,而不是在每个错误码接收的地方都showDialog
- 由于在Application中跳转Activity如何解决
解决方案
目前我们的做法是,
- 在每一个接口请求处调用静态方法对错误码进行统一拦截
- 拦截到登录失效错误码时,我们用RXBus进行事件发送,
- 在Application中接收事件并判断dialog是否已经弹出,弹出不做处理,未弹出则才需要弹出dialog,避免dialog多次弹出问题
- 点击确定后发送事件到MainActivity也就是程序主界面,使其跳转到登录界面.(这里由于安卓各种问题,不能在Application中直接跳转到登录Activity)
代码演示
- 网络请求后,需要对返回码进行统一错误处理
if(ServerErrorUtil.isSuccess(data,true)){
getView().getRoomInfoSucess(data.data);
}
复制代码
- 统一错误处理代码
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;
}
}
}
复制代码
- 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();
}
}
});
复制代码
- 程序首界面接收到跳转消息后则执行跳转
//代码略
复制代码