Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android裡單例對象和某些數據被釋放的問題

android裡單例對象和某些數據被釋放的問題

編輯:關於Android編程

接觸正式的android開發已經有一段時間了,項目的第一個版本終於快完成了。有一次自己在測試的時候,把自己的android項目切到後台,同時打開了幾個應用之後重新切回到自己的app,發現報錯了。經過排查,發現是自己的單例對象中的數據被釋放掉了,也就是int變量的值 變成了0,string變量的值變成了null。

我的單例一開始是這樣的(舉例);

 

public class UserInfo {
	private static UserInfo userInfo = null;
	
	private int level;
	
	private UserInfo() {  
		
    	}
	
	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來進行存取數據的操作,當我們為數據賦值和取出數據的時候,不妨用下面的代碼:

 

	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;
	}
	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裡就不能這樣使用單例嗎?我對此持懷疑態度。

不知道大家有沒有遇到和我一樣的問題,如果遇到了,又是如何解決的呢?該如何在android中使用單例模式呢?希望有好方法的同學能分享自己的看法~

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved