• android在单身的对象和一些数据的问题被释放


    正式接触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模式用它?我希望有一种方式培养学生良好的能分享他们的观点~

  • 相关阅读:
    常用的16个Java实用工具类,Java开发人员请收藏!
    JVM内存区域与垃圾回收
    听说你还不知道Java代码是怎么运行的?
    Java 到底是值传递还是引用传递?
    Java线程池实现原理及其在美团业务中的实践
    别再说Java对象都是在堆内存上分配空间的了!
    面试常问的Java虚拟机内存模型,看这篇就够了!
    好用的Java工具类库,GitHub星标10k+你在用吗?
    MySQL 全文索引实现一个简单版搜索引擎
    laravel 数据库里的图片重命名
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5021397.html
Copyright © 2020-2023  润新知