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,在这个里面处理退出程序操作。

其他方法:

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

时间: 2024-10-08 10:22:05

Android内存重启之静态变量被回收导致nullPoint问题的相关文章

Android进程管理及静态变量垃圾回收

1.Android静态变量的生命周期 静态变量的生命周期遵守Java的设计.我们知道静态变量是在类被load的时候分配内存的,并且存在于方法 区.当类被卸载的时候,静态变量被销毁. 在PC机的客户端程序中,一个类被加载和卸载,可简单的等同于jvm进程的启动和结束.那么在Android中 呢?用的Dalvik vm也是一样的.不过Android不太突出的进程概念,所以对静态变量的生命周期就会感觉模糊,这种模糊对于值类型是无所谓的,如果是静态的对象引用, 则与内存回收.内存泄漏这些问题有关,有必要加

android中少用静态变量(android静态变量static生命周期)

在android中,要少用静态变量. 我现在做的一个应用中,之前的开发人员使用静态变量来存储cookie,这个全局的静态变量用来验证身份. 这时客户反应,应用长时间不使用,再次使用,会提示身份过期. 后来经查,问题基本确定在静态变量上. 上stackoverflow查了android中static变量的生命周期,有人这么说 Lifetime of a static variable: A static variable comes into existence when a class is l

解决android应用被强杀或应用被回收导致的空指针问题

1.问题是如何发生的,会在什么情况下发生此类问题? 当用户运用手机清理助手或后台回收我们的应用造成我们应用程序进程被杀死的时候就有可能出现这种空指针的问题,下面举个例子我们一起来看看这种情况是如何发生的. 如图所示我们新建一个程序Demo,程序中有三个Activity,分别为SplashActivity MainActivity InfoActivity,下面我们简称这三个Activity为A B C.这三个Activity也是模拟我们平时项目的进入流程,SplashActivity也就是我们的

面向对象——概念(成员变量、静态变量、成员方法、静态方法、垃圾回收机制、重载、包)

静态变量和成员变量的区别: 1.成员变量描述的是对象的特征,包含在对象之中.不同的对象成员变量彼此独立.一个对象成员变量的改变,不会影响其他对象. 静态变量独立在对象之外,是所有对象共享的变量.静态变量改变后会影响所有对象. 2.成员变量只能通过对象.的方式访问.而静态变量,可以通过对象.的方式访问,也可以通过类名.的方式访问.所以静态变量也称为类变量 3.成员变量存放在堆空间中,静态变量存放在数据段中. 静态方法和成员方法的区别: 1.静态方法加载时机在对象之前,可以通过对象.和类名.的方式访

android 使用静态变量传递数据

使用静态变量传递数据之通用方式. 测试应用:当前页面点击button传递数据到一个新的页面显示在textview中. 首先在,mainActivity.xml文件中加入一个button按钮 <Button android:id="@+id/button" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="测试

Android内存优化解决 资料和总结的经验分享

在前公司做一个图片处理的应用时, 项目交付的时候,客户的手机在运行应用的时候,一直在崩溃,而这个异常就是OutOfMemory的错误,简称为OOM, 搞得我们也是极其的崩溃,最后 ,我们是通过网上搜集资料和代码走查的方式来优化解决的,这里,我就把我们收集到资料和总结的经验分享下吧. Android的虚拟机是基于寄存器的Dalvik,它的最大堆大小一般是16M,有的机器为24M.我们平常看到的OutOfMemory的错误,通常 是堆内存溢出.移动开发和web开发的最大的区别是设备资源受限,对一般手

Android内存管理分析

大部分因为工作任务繁重,一般我们很少关心内存的事,只知道先把任务完成.只有真正到了发现UI卡顿 或者APP实在跑不下去了(一点一卡),才会考虑到内存优化.或者你所在的大公司比较关心手机运行流利程度,也需要对内存进行管理. 1.内存管理的基础知识 因为安卓的顶层也是 Java来实现的,作为客户顿的程序员应该懂得如何去管理内存. 又因为Java不像C语言可以执行free去主动释放内存,而是提供了一套Java的垃圾处理器.但是该处理器并不能时刻盯着内存,在内存不需要的时候直接清理(程序员比较方便,但是

Android内存管理、优化

RAM对于软件开发环境而言是有价值的资源,但它对受限于物理内存限制的操作系统具有更大的价值.即使Android Runtime和Dalvik virtual machein执行常规的垃圾回收,但这并不意味着你可以忽略app在何时何地指派和释放内存.你仍然需要去避免产生内存泄露.比如长期持有静态成员变量常常引起内存泄露,你应该在合适的时间,比如在生命周期回调函数处释放一些引用对象,来避免内存泄露的发生. 这篇文章将阐述怎样在app中主动的降低内存消耗.关于java编程中清理资源的一般实践,请参照其

android内存优化之三内存分析工具的使用

 anroid内存分析工具的使用 一.Eclipse Heap分析内存泄露 Android开发中避免不了碰到内存泄露问题,这里先大概讲下内存泄露的基本概念:内存泄露官方的解释是是用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元,直到程序结束.它也可以理解为new的新对象用完后,该对象没有得到回收,造成的无用的对象一直占据着内存,这种无用的随着操作的次数越多,占据的内存越多,直到内存溢出程序,报错停止运行.内存溢出问题比起程序直接报错的问题更难定位,光靠阅读代码来分