正式接触android我们一直在开发了一段时间,该项目的第一个版本最终会很快结束。

当有它自己的测试。拥有android后台。同一时候打开了几个应用之后又一次切回到自己的app。发现报错了。经过排查,发现是自己的单例对象中的数据被释放掉了,也就是int变量的值 变成了0,string变量的值变成了null。

我的单例一開始是这种(举例);

public class UserInfo {
private static UserInfo userInfo = null; private int level; private UserInfo() { <span style="white-space:pre"> </span>} public static UserInfo getInstance() {
if (null == userInfo) {
userInfo = new UserInfo();
}
return userInfo;
} public void setLevel(int level){
this.level = level;
} public int getLevel(){
return level;
}
}

这应该是一个比較普通的单例类。用来存储我们常常使用的变量。平时我的使用是没有问题的。在各个activity。fragment里都能够正常使用,如以下代码片段:

if(UserInfo.getInstance().getLevel() == 3){
//我们的代码块
}

可是,当我使用我的測试机(測试机是512m内存)进行測试的时候,首先把android应用切到后台,打开多个其它的app如qq等,再把我们的应用恢复到前台的时候,上面样例的代码块居然没有进入,我通过打印调试发现getLevel()的值已经是0了,也就是被释放了。

我google了一下,有些人在android上使用像我这种单例是没问题的。而有些人则会说自己的单例被释放了。也就是和我的情况一样。

可能是因为手机内存吃紧,我们单例对象存储的数据被迫被释放了。

以下就要找到这个问题的解决方法。

(1)使用android application 。这种方法本来我是想使用的,可是大概查了一下。比如这篇文章:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0204/2409.html

发现最好不要使用这样的方法,甚至文章里写了都不要使用单例~~我自己试了一下,感觉问题依旧存在。

(2)onSaveInstanceState() 和 onRestoreInstanceState()。当我发生这个问题的时候,都是android强制性的移除了我当前的activity。可能同一时候释放了我的单例对象中的数据。

我也的确运行了onSaveInstanceState()函数。同一时候在切回来的时候运行了onRestoreInstanceState()重绘我的activity,那么我能够在onSaveInstanceState()
里存储我的单例数据,然后在onRestoreInstanceState()里对我的数据进行又一次赋值。这样貌似也是能够的,可是。这种话,单例用起来就太那啥了,感觉都不须要单例了。

(3)使用SharedPreferences来进行存取数据的操作。当我们为数据赋值和取出数据的时候,最好还是用以下的代码:

<span style="white-space:pre">	</span>public void setLevel(int level, Context context){
saveSharedPreferences(context, "level", level+"");
this.level = level;
} public int getLevel(Context context){
level = Integer.parseInt(Utils.readSharedPreferences(context, "level"));
return level;
}
<span style="white-space:pre">	</span>public static void saveSharedPreferences(Context context, String name, String data) {
SharedPreferences sharedPreferences = context.getSharedPreferences("school_user_info", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString(name, data);
editor.commit();
} public static String readSharedPreferences(Context context, String name) {
SharedPreferences sharedPreferences = context.getSharedPreferences("school_user_info", Context.MODE_MULTI_PROCESS);
return sharedPreferences.getString(name, "");
}

在为单例对象中的数据赋值的时候。把这个数据存放在preference中,使用的时候,再从preference中取出我的值,进行对应的操作,这样做的话,即使当我的单例被释放了。我依然能够从preference中取出数据。这样做之后,我发现自己之前的bug就消失了,不会由于数据为空导致各种各样的错误了。

可是。细致想一下。发现这样做的话单例模式在这里使用就略有多余,我直接存取preference就能够了。干嘛还要这样写呢?由于项目进度较为紧迫,我仅仅好用(3)方法改动了一下我的代码保证了其没有这种bug。可是这样做以我如今的眼光来看。并非很好,感觉造成了代码的多余。可是单例模式是我们的工作中使用最频繁的设计的图案。在中学的时候,我们经常用它,它是在android当你不能这样使用一个单一的情况下做的?我是持怀疑态度。

我不知道,我还没有遇到过同样的问题,假设满足,而如何解决呢?如何androidSingleton模式用它?我希望有一种方式培养学生良好的能分享他们的观点~

android在单身的对象和一些数据的问题被释放的更多相关文章

  1. 无废话Android之listview入门,自定义的数据适配器、采用layoutInflater打气筒创建一个view对象、常用数据适配器ArrayAdapter、SimpleAdapter、使用ContentProvider(内容提供者)共享数据、短信的备份、插入一条记录到系统短信应用(3)

    1.listview入门,自定义的数据适配器 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/and ...

  2. 【安卓开发】为什么不能往Android的Application对象里存储数据

    在一个App里面总有一些数据需要在多个地方用到.这些数据可能是一个 session token,一次费时计算的结果等.通常为了避免activity之间传递对象的开销 ,这些数据一般都会保存到持久化存储 ...

  3. 为什么不能往Android的Application对象里存储数据

    在一个App里面总有一些数据需要在多个地方用到.这些数据可能是一个 session token,一次费时计算的结果等.通常为了避免activity之间传递对象的开销 ,这些数据一般都会保存到持久化存储 ...

  4. Android简单介绍SharedPreference,内部文件,sdcard数据存储

    SharedPreference 以xml的结构储存简单的数据,储存在data/data/程序包名/shared_prefs文件夹中 使用方式 创建对象的方式有三种 Context 的 getShar ...

  5. 转:Android 判断用户2G/3G/4G移动数据网络

    Android 判断用户2G/3G/4G移动数据网络 在做 Android App 的时候,为了给用户省流量,为了不激起用户的愤怒,为了更好的用户体验,是需要根据用户当前网络情况来做一些调整的,也可以 ...

  6. Android提供了5种方式存储数据:

    --使用SharedPreferences存储数据: --文件存储数据: --SQLite数据库存储数据: --使用ContentProvider存储数据: --网络存储数据: 一:使用SharedP ...

  7. Android 判断用户2G/3G/4G移动数据网络

    Android 判断用户2G/3G/4G移动数据网络 在做 Android App 的时候,为了给用户省流量,为了不激起用户的愤怒,为了更好的用户体验,是需要根据用户当前网络情况来做一些调整的,也可以 ...

  8. 如何获取Android系统中申请对象的信息

    最近一直在做有关内存方面的优化工作,在做优化的过程,除了关注内存的申请量以及GC的情况之外,我们经常需要想方法找出是那些对象占用了大量内存,以及他们是如何导致GC的,这意味着我们需要获取对象申请的信息 ...

  9. android开发中的5种存储数据方式

    数据存储在开发中是使用最频繁的,根据不同的情况选择不同的存储数据方式对于提高开发效率很有帮助.下面笔者在主要介绍Android平台中实现数据存储的5种方式. 1.使用SharedPreferences ...

随机推荐

  1. Autofac 入门

    Autofac 入门文档 原文链接:http://docs.autofac.org/en/latest/getting-started/index.html 在程序中使用Autofac的基本模式是: ...

  2. MySQL InnoDB存储引擎undo redo解析

    本文介绍MySQL数据库InnoDB存储引擎重做日志漫游 00 – Undo Log Undo Log 为了实现事务原子,在MySQL数据库InnoDB存储引擎,还使用Undo Log(简称:MVCC ...

  3. 查看SQLSERVER内部数据页面的小插件Internals Viewer

    原文:查看SQLSERVER内部数据页面的小插件Internals Viewer 查看SQLSERVER内部数据页面的小插件Internals Viewer 感觉internals viewer这个名 ...

  4. HDU 1274 展开字符串 (递归+string类)

    题目链接:HDU 1274 展开字符串 中文题. 左括号进入DFS函数,右括号return到上一层. 注意return回去的是这个一层递归中的括号中的字母串. AC代码: #include<st ...

  5. CentOS在安装配置 Ngnix_tomcat_PHP_Mysql

    安装Nginx yum install nginx 假设显示找不到 nginx包,新建一个文件/etc/yum.repos.d/nginx.repo,内容: [nginx] name=nginx re ...

  6. 惠普4431s 笔记本配置

    hp-4431s驱动精灵硬件检测报告 版本:2015.3.26.1363(8.1.326.1363)================================================== ...

  7. php+sqlite 最佳web服务器

    1 wampserver   支持mysql.每次都启动mysql,可以手动停止.但是运行时有时会很慢. 放弃 2 APS绿色版(Apache+PHP+SQLite)  组件环境:Apache2.2. ...

  8. Android源代码学习之六——ActivityManager框架解析

    ActivityManager在操作系统中有关键的数据,本文利用操作系统源代码,逐步理清ActivityManager的框架,并从静态类结构图和动态序列图两个角度分别进行剖析,从而帮助开发者加强对系统 ...

  9. MMTool制作Ozmosis引导BIOS完美引导OS X系统

    Ozmosis引导是德国黑苹果爱好者制作的一个引导程序,目前仍处于测试版,有了它,你可以不用再使用四叶草.变色龙之类引导工具,相对而言它更象白苹果.Ozmosis是基于AMI公司bios的硬件引导驱动 ...

  10. IIS7和IIS7.5备份和还原的方法

    windows2008的iis配置备份和iis6不同,在iis7中没有了6原来的保存配置xml的选项,而采用的是dos命令来进行iis7的备份.以下是win2008上iis7备份的方法. 首先打开CM ...