相信很多人都遇到过App 莫名其妙就崩溃的情况,尤其是一些配置很低的手机,重现场景就是在App 切换到后台,闲置了一段时间后再继续使用时,就会崩溃。导致上述崩溃发生的罪魁祸首就是全局变量。

  在内存不足的时候,系统会回收一部分闲置的资源,由于App 被切换到后台,所以之前存放的全局变量很容易被回收,这时再切换到前台继续使用,在使用某个全局变量的时候,就会因为全局变量的值为空而崩溃。这不是个例,任何页面从后台切换回前台都有崩溃的可能。想彻底解决这个问题,就一定要使用序列化技术。

1 把数据作为Intent 的参数传递

  想一劳永逸地解决上述问题就是不使用全局变量,使用Intent 来进行页面间数据的传递。因为,即使目标Activity 被系统销毁了,Intent 上的数据仍然存在,所以Intent 是保存数据的一个很好的地方,比本地文件靠谱。但是Intent 能传递的数据类型也必须支持序列化,像JSONObject 这样的数据类型,是传递不过去的。另外,如果Intent 上携带的数据量过大,也会发生崩溃。

2  把全局变量序列化到本地

  另一个比较稳妥的解决方案是,我们仍然使用全局变量,在每次修改全局变量的值的时候,都要把值序列化到本地文件中,这样的话,即使内存中的全局变量被回收,本地还保存有最新的值,当我们再次使用全局变量时,就从本地文件中再反序列化到内存中。这样就解了燃眉之急,数据不再丢失。但长远之计还是要一个模块一个模块地将全局变量转换为Intent 上可序列化的实体数据。但这是后话,眼前,我们先要把全局变量序列化到本地文件

3 序列化的缺点

  再次强调,把全局变量序列化到本地的方案,只是一种过渡型解决方案,它有几个硬伤:

1)每次设置全局变量的值都要强制执行一次序列化的操作,容易造成ANR。

2)序列化生成的文件,会因为内存不够而丢失。

3)Android 提供的数据类型并不全都支持序列化(如JSONObject和JSONArray)。

4 如何看待SharedPreferences

  在我们决定禁止使用全局变量后,曾经一段时间确实有了很好的效果,但是我后来仔细一看项目,新的全局变量倒是真的不再有了,大家都改为存取SharedPreferences 的方式了。

  在我看来,SharedPreferences 是全局变量序列化到本地的另一种形式。SharedPreferences中也是可以存取任何支持序列化的数据类型的。

  我们应该严格控制SharedPreferences 中存放的变量的数量。有些数据存在SharedPreferences中是合理的,比如说当前所在城市名称、设置页面的那些开关的状态等等。但不要把页面跳转时要传递的数据放在SharedPreferences 中。这时候,要优先考虑使用Intent 来传递数据。

5 User 是唯一例外的全局变量

  App 中只有一个全局变量的存在是合理的,那就是User 类。我们在任何地方都有可能使用到User 这个全局变量,比如获取用户名、用户昵称、身份证号码等等。

  User 这个全局变量的实现,可以参考本章讲解的例子。每次登录,都要把登录成功后获取到的用户信息保存到User 类。以后,每当User 的属性有变动时,我们都要把User 保存一次。退出登录,就把User 类的信息进行清空。与之前我们所设计的全局变量不同,App 启动时不需要清空User 类的数据。因为我们希望App 记住上次用户的登录状态以及用户信息。再讲下去就涉及用户Cookie 的机制了。

5.3 Static的更多相关文章

  1. static,你还敢用吗?(二)

    为了压系统,昨天小组在测试环境模拟了一大批订单数据.今天上午查看记录的账单计息日志,发现了一大堆的MySqlException MySql.Data.MySqlClient.MySqlExceptio ...

  2. const,static,extern 简介

    const,static,extern 简介 一.const与宏的区别: const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 执行时刻:宏是预编 ...

  3. const extern static 终极指南

    const extern static 终极指南 不管是从事哪种语言的开发工作,const extern static 这三个关键字的用法和原理都是我们必须明白的.本文将对此做出非常详细的讲解. co ...

  4. PHP static静态属性和静态方法

    这里分析了php面向对象中static静态属性和静态方法的调用.关于它们的调用(能不能调用,怎么样调用),需要弄明白了他们在内存中存放位置,这样就非常容易理解了.静态属性.方法(包括静态与非静态)在内 ...

  5. static,你还敢用吗?

    我用火狐的HttpRequester测试开发组里一个同学发布的Web API接口,遇到了一个奇怪的问题. 我测试边界情况时,第一次调用响应的结果是正常的,但当再次及以后的请求时,却返回了异常“Syst ...

  6. Java关键字:static

    通常,当创建类时,就是在描述那个类的外观和行为.只有用new创建类的对象时,才分配数据存储空间,方法才能被调用.但往往我们会有下面两种需求: 1.我想要这样一个存储空间:不管创建多少对象,无论是不创建 ...

  7. Android 中关于static的使用问题

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/5251564.html 项目中,在不停地接收串口数据很长一段时间(几小时)后,会偶然性的报错.初步排除了oom ...

  8. iOS: 在UIViewController 中添加Static UITableView

    如果你直接在 UIViewController 中加入一个 UITableView 并将其 Content 属性设置为 Static Cells,此时 Xcode 会报错: Static table ...

  9. 浅谈Static关键字

    1.使用static关键字声明的属性为全局属性 未使用static关键字指定city之前,如果需要将Tom,Jack,Mary三人的城市均改成Beijing,需要再次声明三次对象的city为Beiji ...

  10. 今天思考一个问题,PHP const和static的区别

    static关键字在类中是,描述一个成员是静态的,static能够限制外部的访问,因为static后的成员是属于类的,是不属于任何对象实例,其他类是无法访问的,只对类的实例共享,能一定程序对该成员尽心 ...

随机推荐

  1. JS,Jquery获取各种屏幕的宽度和高度

    Javascript: 网页可见区域宽: document.body.clientWidth网页可见区域高: document.body.clientHeight网页可见区域宽: document.b ...

  2. 第五百八十天 how can I 坚持

    一定要稳住啊,怎么感觉心神不宁呢.哎.越是这种情况越能考验一个人吧. 说都会说,做起来真的好难啊. 今天上班一天都感觉心神不宁的.到底是哪出了问题,事情太多了.好吧,是挺多的,考研.上班,还得考虑结婚 ...

  3. vagrant系列教程(三):vagrant搭建的php7环境(转)

    原文:http://blog.csdn.net/hel12he/article/details/51107236 前面已经把vagrant的基础知识已经基本过了一遍 了,相信只要按着教程来,你已经搭建 ...

  4. Gradient Boosting Decision Tree学习

    Gradient Boosting Decision Tree,即梯度提升树,简称GBDT,也叫GBRT(Gradient Boosting Regression Tree),也称为Multiple ...

  5. 误将文件push到Git,如何删除

    首先在本地删除多余文件夹(文件) 使用git add -u  git add -u,使用-u参数调用了git add命令,会将本地有改动(包括删除和修改)的已经追踪的文件标记到暂存区中.    再co ...

  6. 多台web如何共享session进行存储(转载)

    session的存储了解以前是怎么做的,搞清楚了来龙去脉,才会明白进行共享背后的思想和出发点.我喜欢按照这样的方式来问(或者去搞清楚):为什么要session要进行共享,不共享会什么问题呢? php中 ...

  7. S5PV210的LCD控制器详解

    1.FIMD结构框图 (1)Samsung的s5pv210的LCD控制器叫做FIMD(也叫显示控制器).Display controller(显示控制器)包括用于将图像数据从相机接口控制器的本 地总线 ...

  8. python类——黑板客老师课程学习

    1.基本语法 class class_name(base_class):  base_class是它继承的父类 class_var def methods(self,args): statements ...

  9. ubuntu 14 配置JDK

    1. 下载JDK http://www.oracle.com/technetwork/cn/java/javase/downloads/index.html 下载后的保存地址: /home/root1 ...

  10. super

    [super] Return a proxy object that delegates method calls to a parent or sibling class of type. This ...