static修飾的靜態變數,使用很方便,在不同的類和包中都可以使用,在虛擬機器中單獨佔用記憶體,沒錯,這些都是它們的優點,不過在項目上線後,才發現static有一些不太好的地方。
在查看項目的崩潰資訊時,發現很多地方莫明的出現null 指標異常的錯誤,經過排查,發現可能就是static的問題。我們在項目中,將使用者的資訊也就是User對象儲存成了一個靜態變數,而在報錯的地方,也都發現有使用過這種變數,因此,可以大致推斷出與這種儲存的方式有一定的聯絡。同時,有不少使用者反映在開啟應用的情況下,接個電話或者長時間待機後,再回到應用也會出現崩潰的現象,而這些崩潰都與靜態變數的null 指標有關係。
如此來說的話,static靜態修飾在Android的開發中是不是很危險?或許我們可以說如果是static User u = new User();這樣定義的話,那麼應該不會有太大問題,而如果是static User u;這樣定義的話,那麼很可以會出現NULL的現象。當然,前面的方法裡面的屬性也可能會現空的情況,但是這個可以用封裝來避免null 指標。另外靜態常量還是很好用的。
那麼應該如何儲存登入或者全域的資訊呢?根據Google官方的推薦以及百度到的各位大神的推薦,我們應該盡量使用繼承自Application的自訂類,在我們繼承的類中定義需要全域使用的變數,並通過getApplicationContext()來擷取和儲存相關的變數即可。
比如:
public class TestApplication extends Application { private int curIndex; public int getCurIndex() { return curIndex; } public void setCurIndex(int curIndex) { this.curIndex = curIndex; } @Override public void onCreate() { super.onCreate(); } @Override public void onTerminate() { super.onTerminate(); } }
而在Activity中靈活使用即可
TestApplication application = (TestApplication) this.getApplicationContext();//儲存變數application.setCurIndex(5);//擷取變數application.getCurIndex();
Application是與應用同時存在的,也就是應用在它就在,並不會被GC給莫名其妙的回收掉,因此,使用此方法更加安全的穩妥,另外在Application中還可以幹很多事,這個我們以後再說。
----------------------------------
我的獨立部落格:http://www.zyblog.net
開發相關的會和CSDN同步
本文連結:點擊開啟連結