Android之項目全域變數的定義

來源:互聯網
上載者:User

        static修飾的靜態變數,使用很方便,在不同的類和包中都可以使用,在虛擬機器中單獨佔用記憶體,沒錯,這些都是它們的優點,不過在項目上線後,才發現static有一些不太好的地方。

        在查看項目的崩潰資訊時,發現很多地方莫明的出現null 指標異常的錯誤,經過排查,發現可能就是static的問題。我們在項目中,將使用者的資訊也就是User對象儲存成了一個靜態變數,而在報錯的地方,也都發現有使用過這種變數,因此,可以大致推斷出與這種儲存的方式有一定的聯絡。同時,有不少使用者反映在開啟應用的情況下,接個電話或者長時間待機後,再回到應用也會出現崩潰的現象,而這些崩潰都與靜態變數的null 指標有關係。

        如此來說的話,static靜態修飾在Android的開發中是不是很危險?或許我們可以說如果是static User u = new User();這樣定義的話,那麼應該不會有太大問題,而如果是static User u;這樣定義的話,那麼很可以會出現NULL的現象。當然,前面的方法裡面的屬性也可能會現空的情況,但是這個可以用封裝來避免null 指標。另外靜態常量還是很好用的。

        那麼應該如何儲存登入或者全域的資訊呢?根據Google官方的推薦以及百度到的各位大神的推薦,我們應該盡量使用繼承自Application的自訂類,在我們繼承的類中定義需要全域使用的變數,並通過getApplicationContext()來擷取和儲存相關的變數即可。

/** * 自訂的MyApplication繼承Application *  * @author way *  */public class MyApplication extends Application {/** * 引發異常:在一些不規範的代碼中經常看到Activity或者是Service當中定義許多靜態成員屬性。這樣做可能會造成許多莫名其妙的 null * pointer異常。 *//** * 異常分析:Java虛擬機器的記憶體回收機制會主動回收沒有被引用的對象或屬性。在記憶體不足時,虛擬機器會主動回收處於背景Activity或 * Service所佔用的記憶體。當應用再次去調用靜態屬性或對象的時候,就會造成null pointer異常 *//** * 解決異常:Application在整個應用中,只要進程存在,Application的靜態成員變數就不會被回收,不會造成null pointer異常 */private int number;@Overridepublic void onCreate() {// TODO Auto-generated method stubsuper.onCreate();}public int getNumber() {return number;}public void setNumber(int number) {this.number = number;}}

不過,為了讓我們的MyApplication取代android.app.Application的地位,在我們的代碼中生效,我們需要修改AndroidManifest.xml:

<application android:name=".MyApplication" ...></application>

下面我們就可以在Activity或Service中靈活使用了:

MyApplication application = (MyApplication) this.getApplicationContext(); //儲存變數application.setNumber(5);//取出變數application.getNumber();

Application是與應用同時存在的,也就是應用在它就在,並不會被GC給莫名其妙的回收掉,因此,使用此方法更加安全。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.