关于APP中User信息的处理
2016-12-16 本文已影响74人
gzfgeh
全局变量(bug)
首先肯定不能用全局变量保存User,因为这样当APP内存不足的时候会回收static全局变量,当自己再次使用的时候User就会变为null.
同样适合其他情况,也就是说不能用全局变量来传递数据
Application(bug)
开始以为这种情况是OK的,但是真的也会回收Application,就是APP后台运行很长时间锁屏,然后第二天再次打开的时候Application是重新创建的,所以里面的变量都会重新初始化,那么User会再次变为null.
存到SharedPreferences(解决方法)
建立User类,然后提供static方法,拿到user以后先判断是否为null,为null就去SharedPreferences里面取值。我现在是用的单例
5.png因为userinfo都是一个类,所以要序列化一下然后存起来,其他情况类似,所以全局都用的变量,禁止单单用全局变量和Application全局变量传递,真的会回收!!
用户信息过期问题
情景:比如在支付页面,并且页面中显示金额,但是现在有其他事情了这个页面没有关闭,然后有人用同一个账号在PC端修改了密码并且交易了订单,这个时候要退出登录.
方案:
因为项目中用了RxJava,并且封装了网络请求的处理,详情见GitHub
-
首先识别出用户信息过期
6.png -
因为网络回调也做了封装,所以在回调中对用户信息过期做统一处理
7.png
其中处理就是跳转到LoginActivity页面,注意要检查是否已经开启了LoginActivity页面,不能重复开启,
public static void startLoginActivity(Context mContext){
if (!APPLike.getAPPLike().getActivityMgr().isHaveLoginActivity()){
Intent intent = new Intent(mContext, LoginActivity.class);
intent.putExtra("login_activity", RxUtils.TOKEN_OVER_TIME);
mContext.startActivity(intent);
}
}
登录成功以后,把所以页面destroy,然后跳转到MainActivity的Fragment(因为我的页面结构像微信以后是MainActivity包含4个Fragment)
8.png
- 通知MainActivity中的Fragment刷新数据
这里就是通过RxBus或者EventBus发送通知事件,然后在BaseFragment中接收通知事件,调用一个update()函数,然后子类Fragment中继承这个update函数,然后在这个函数中执行网络回调来刷新界面,至此完成!