編輯:關於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中使用單例模式呢?希望有好方法的同學能分享自己的看法~
在android開發中會經常遇到滑動沖突(比如ScrollView或是SliddingMenu與ListView的嵌套)的問題,需要我們深入的了解android事件響應
在你手機中,打開文件的方式有這麼幾種:1、通過要打開的這個文件的類型找到對應的應用程序app打開2、通過已知文件類型打開應用程序,找到對應的這個文件打開簡單點說,通過文件
本文實例講述了android中圓角圖像生成方法。分享給大家供大家參考。具體分析如下:在android開發中為了美觀,常常要求ImageView中顯示出圓角圖像的效果,這個
開源項目:Android-ObservableScrollView**項目依賴添加:compile ‘com.github.ksoichiro:android