关于APP中User信息的处理

全局变量(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函数,然后在这个函数中执行网络回调来刷新界面,至此完成!
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,322评论 25 709
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 11,721评论 0 17
  • 环信官方Demo源码分析及SDK简单应用 环信官方Demo源码分析及SDK简单应用-ChatDemoUI3.0 环...
    imGeek阅读 8,256评论 3 5
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,384评论 19 139
  • 白天上班有些累,给儿子勉强洗完澡就早早的躺下睡了。睡梦中被老公打来的电话吵醒,他说儿子明天早上要参加体检,接过电话...
    姚小红阅读 2,726评论 5 10