android裡單例對象和某些資料被釋放的問題

來源:互聯網
上載者:User

標籤:

接觸正式的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上使用像我這樣的單例是沒問題的,而有些人則會說自己的單例被釋放了,也就是和我的情況一樣。可能是由於手機記憶體吃緊,我們單例Object Storage Service的資料被迫被釋放了。

下面就要找到這個問題的解決方案。

(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)方法修改了一下My Code保證了其沒有這樣的bug,但是這樣做以我現在的眼光來看,並不是非常好,感覺造成了代碼的多餘。但是單例模式是我們工作中最常用到的設計模式了,在學校的時候我們就經常使用它,難道在android裡就不能這樣使用單例嗎?我對此持懷疑態度。

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

android裡單例對象和某些資料被釋放的問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.