志不强者智不达,言不信者行不果。这篇文章主要讲述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()来获取和保存相关的变量即可。
【Android内存重启之静态变量被回收导致nullPoint问题】具体代码参考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 代码实现模拟用户点击滑动等操作
- 身份证识别,手机银行APP必备插件
- Android性能优化(ViewStub)
- Citrix XenApp/XenDesktop版本正确选择
- 关于android SDK安装Failed to fetch URL http://dl-ssl.google.com/android/repository/addons_list-1.xml出错二(
- 安卓权威编程-笔记(19章 使用SoundPool播放音频)
- JCameraView 仿微信拍照Android控件(点击拍照,长按录小视频)
- Android java.lang.NoSuchFieldError: No static field xxx of type I in class Lcom/XX/R$id; or its supe
- Android(Linux)模拟按键触摸屏等事件