Android項目全局變量的定義

jopen 10年前發布 | 67K 次閱讀 Android Android開發 移動開發

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

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

        如此來說的話,static靜態修飾在Android的開發中是不是很危險?或許我們可以說如果是static User u = new User();這樣定義的話,那么應該不會有太大問題,而如果是static User u;這樣定義的話,那么很可以會出現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;  

    @Override  
    public void onCreate() {  
        // TODO Auto-generated method stub  
        super.onCreate();  
    }  

    public int getNumber() {  
        return number;  
    }  

    public void setNumber(int number) {  
        this.number = number;  
    }  
}  </pre> <p>不過,為了讓我們的MyApplication取代android.app.Application的地位,在我們的代碼中生效,我們需要修改AndroidManifest.xml:</p>

</div> </div>

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


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

</div> </div>

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

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

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!