Android開發之警惕static變數使用

來源:互聯網
上載者:User

 

大家都知道static變數有很多好處就是可以在儲存全域資料。但是由此可能帶來很隱形BUG。

情況:


本人在開發一個項目的時侯有切身的體會,以下這個BUG尋找了很久才知道。由於多個人開發的項目。某個同事使用了static預先緩衝一些列表資料,方便下個介面使用。該資料儲存了一些圖片的引用,而這些圖片又單獨在另外一個列表儲存,但是在退出程式的時侯又把這些圖片Recycle(回收)了。

 


現象:

偶爾進入程式出現使用了已回收的圖片的問題。

java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap

 


分析:

由於Android架構設計原因,在程式退出時,static資料並沒有立即得到清理。在上面的案例中可以發現,當積極式載入網路資料比較慢,再進入下一個介面時,發現static變數有資料。這個時侯就使用這個資料就是程式退出時的資料,但該資料引用的圖片已回收。就導致前面的現象發生。

 


解決:

在退出程式時,同時清空static變數裡面的資料。

 


建議:

在開發的過程中,盡量少使用static資料,盡量把static變數集中在一個類。(僅供參考)

 


延伸:

Android退出程式時,沒有把static資料立即清理的驗證。


public class TestStatic {
    private static int nValue = 0;
    static {
        nValue += 100;
    }
   
    public TestStatic() {
        nValue += 300;
        Log.i("TestStatic", "nValue:"+nValue);
    }

}

 


結果:

05-09 11:15:04.589: I/TestStatic(8093): nValue:400
05-09 11:15:08.309: I/TestStatic(8093): nValue:700

 


第一次進入程式時,先執行static代碼,再到TestStatic();

第二次進入程式時,直接執行TestStatic(),跳過了static代碼;

 

 

 

相關文章

聯繫我們

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