• Android内存重启之静态变量被回收导致nullPoint问题


    通常我称系统为了维持当前app运行稳定而进行内存清场动作导致后台app被强制清理的情况成为内存重启。

    那么内存重启会导致的一个问题就是app被杀掉之后对应的静态变量也会被同时清理掉。那么怎么解决这个问题呢。

    据我研究可以使用这么几个方法:

    方法一:

      //activity销毁之前保存配置信息,防止静态变量数据丢失
        @Override
        protected void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            //这里保存Parcelable(序列化)后的config对象
            outState.putParcelable("config",config);
        }
        //activity恢复的时候恢复保存的数据
        @Override
        public void onRestoreInstanceState(Bundle savedInstanceState) {
            super.onRestoreInstanceState(savedInstanceState);
            ////这里恢复config对象
            config=savedInstanceState.getParcelable("config");
        }

    方法二:

    根据Google官方的推荐以及百度到的各位大神的推荐,我们应该尽量使用继承自Application的自定义类,在我们继承的类中定义需要全局使用的变量,并通过getApplicationContext()来获取和保存相关的变量即可。

    具体代码参考http://blog.csdn.net/weihan1314/article/details/8033052

    方法三:

    监测到Activity快被系统回收的时候,应用自杀。你想想反正横竖都是死,与其被系统杀死并报异常,不如自杀,18年后又是一条好汉。

    用户打开应用,重新加载静态变量,这是保险粗暴又安全的方法。

    /**
         * 内存不够时
         * @param level
         */
        @Override
        public void onTrimMemory(int level) {
            super.onTrimMemory(level);
            if (level == TRIM_MEMORY_MODERATE) {
                //开始自杀,清场掉所有的activity
        //下面这个是自己写的方法  
      ((TMDApplication) getApplication()).destroyAllData(null);
     } }

    附录:内存级别等级

    TRIM_MEMORY_COMPLETE:内存不足,并且该进程在后台进程列表最后一个,马上就要被清理
    TRIM_MEMORY_MODERATE:内存不足,并且该进程在后台进程列表的中部。
    TRIM_MEMORY_BACKGROUND:内存不足,并且该进程是后台进程。
    TRIM_MEMORY_UI_HIDDEN:内存不足,并且该进程的UI已经不可见了
    TRIM_MEMORY_COMPLETE这个监听的时候有时候监听不到,建议监听TRIM_MEMORY_MODERATE,在这个里面处理退出程序操作。

    其他方法:

    例如:把配置文件保存到数据库、保存到本地文件等等方法。缺点就是读取耗时间,不建议使用。

  • 相关阅读:
    微信小程序-隐藏和显示自定义的导航
    微信小程序-注册和第一个demo
    QRCodeHelper 二维码生成
    Excel 操作
    angular 初体验
    angular 环境搭建
    代码注入
    c# 从一个服务器 访问另外一个服务器上的文件
    oracle 分组取第一行数据 ,查询sql语句
    软件项目验收需要的文档 ,谢谢补充
  • 原文地址:https://www.cnblogs.com/zhang-cb/p/7196733.html
Copyright © 2020-2023  润新知