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

Posted 客舍青

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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,在这个里面处理退出程序操作。

 

其他方法:

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

以上是关于Android内存重启之静态变量被回收导致nullPoint问题的主要内容,如果未能解决你的问题,请参考以下文章

JVM内存泄漏导致内存溢出(OOM)的场景

js性能优化之-闭包(内存泄漏)

GC垃圾回收

Android技术分享|Android 中部分内存泄漏示例及解决方案

Android App解决卡顿慢之内存抖动及内存泄漏(发现和定位)

Android :安卓学习笔记之事件内存泄露 的简单理解