美文网首页
关于APP中User信息的处理

关于APP中User信息的处理

作者: gzfgeh | 来源:发表于2016-12-16 15:57 被阅读74次

    全局变量(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

    1. 首先识别出用户信息过期


      6.png
    2. 因为网络回调也做了封装,所以在回调中对用户信息过期做统一处理 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
    1. 通知MainActivity中的Fragment刷新数据
      这里就是通过RxBus或者EventBus发送通知事件,然后在BaseFragment中接收通知事件,调用一个update()函数,然后子类Fragment中继承这个update函数,然后在这个函数中执行网络回调来刷新界面,至此完成!

    相关文章

      网友评论

          本文标题:关于APP中User信息的处理

          本文链接:https://www.haomeiwen.com/subject/libnmttx.html