編輯:關於Android編程
Android是用Java開發,其靜態變量的生命周期遵守Java的設計。我們知道靜態變量是在類被load的時候分配內存的,並且存在於方法區。當類被卸載的時候,靜態變量被銷毀。在PC機的客戶端程序中,一個類被加載和卸載,可簡單的等同於jvm進程的啟動和結束。那麼在Android中呢?用的Dalvik vm也是一樣的。不過Android不太突出的進程概念,所以對靜態變量的生命周期就會感覺模糊,這種模糊對於值類型是無所謂的,如果是靜態的對象引用,則與內存回收、內存洩漏這些問題有關,有必要加深研究和理解。
一、靜態變量在類被加載的時候分配內存。
類在什麼時候被加載?
當我們啟動一個app的時候,系統會創建一個進程,此進程會加載一個Dalvik VM的實例,然後代碼就運行在DVM之上,類的加載和卸載,垃圾回收等事情都由DVM負責。也就是說在進程啟動的時候,類被加載,靜態變量被分配內存。
二、靜態變量在類被卸載的時候銷毀。
類在什麼時候被卸載?
在進程結束的時候。
說明:一般情況下,所有的類都是默認的ClassLoader加載的,只要ClassLoader存在,類就不會被卸載,而默認的ClassLoader生命周期是與進程一致的,本文討論一般情況。
三、Android中的進程什麼時候結束
這個是Android對進程和內存管理不同於PC的核心——如果資源足夠,Android不會殺掉任何進程,另一個意思就是進程隨時可能會被殺掉。而Android會在資源夠的時候,重啟被殺掉的進程。也就是說靜態變量的值,如果不做處理,是不可靠的,可以說內存中的一切都不可靠。如果要可靠,還是得保存到Nand或SD卡中去,在重啟的時候恢復回來。
另一種情況就是不能把退出所有Activity等同於進程的退出,所以在用戶點擊圖標啟動應用的時候,以前存放於靜態變量中的值,有可能還存在,因此要視具體情況給予清空操作。
四、Application也是一樣不可靠
Application其實是一個單例對象,也是放在內存中的,當進程被殺掉,就全清空了,只不過Android系統會幫重建Application,而我們存放在Application的數據自然就沒有了,還是得自己處理。
五、靜態引用的對象不會被垃圾回收
只要靜態變量沒有被銷毀也沒有置null,其對象一直被保持引用,也即引用計數不可能是0,因此不會被垃圾回收。因此,單例對象在運行時不會被回收
工作中需要實現仿釘釘群頭像的一個功能,就是個人的頭像拼到一起顯示,看了一下市場上的APP好像微信的群聊頭像是組合的,QQ的頭像不是,別的好像也沒有了。給大家分享一下怎麼實
介紹A StateListDrawable is a drawable object defined in XML that uses a several differe
最近在研究一塊TI公司的TMDEVM-AM3358開發板,這是一款硬件資源相當豐富並且性能非常好的工業評估板,我重點需要用到板上的網卡、串口以及CAN總線。眾所周知,在a
先通過一個頁面看下事情的來龍去脈,頁面如下所示: 這個頁面剛好一屏幕大小,所以沒有滾動條,因為“保存”鍵上面那個項目備注是需要用戶去填寫的,當他點擊後就會出現虛