Android效能優化(一)記憶體洩露優化(靜態變數、單例模式、屬性動畫)
記憶體洩露優化分為兩個方面,一方面是在開發過程中避免寫出有記憶體洩露的程式碼,另一方面是通過一些分析工具比如 MAT來找出潛在的記憶體洩露繼而解決。
一、靜態變數導致記憶體洩露。一般情況下靜態變數引用了或者內部持有Activity導致Activity無法銷燬會導致記憶體洩露。程式碼如下:
二、單例模式導致記憶體洩露
Android的單例模式在我們專案開發中經常會用到,不過使用的不恰當的話也會造成記憶體洩漏。因為單例的靜態特性使得單例的生命週期和應用的生命週期一樣長, 這就說明了如果一個物件已經不需要使用了,而單例物件還持有該物件的引用,那麼這個物件將不能被正常回收,這就導致了記憶體洩漏。
建立一個單例類AppManager,程式碼如下
在MainActivity中使用此單例,程式碼如下:
我們來分析一下,為什麼會記憶體洩漏呢?
AppManager appManager=AppManager.getInstance(this);
這句傳入的是Activity的Context,我們都知道,Activty是間接繼承於Context的,當這Activity退出時,Activity應該被回收, 但是單例中又持有它的引用,導致Activity回收失敗,造成記憶體洩漏。
為了以防誤傳Activity的Context , 我們可以修改一下單例的程式碼,如下:
這樣子修改,不管外面傳入什麼Context,最終都會使用Applicaton的Context,而我們單例的生命週期和應用的一樣長,這樣就防止了記憶體洩漏。
三、屬性動畫導致記憶體洩露
從 Android3.0開始,Google提供了屬性動畫,屬性動畫中有一類無限迴圈的動畫,如果在Activity中播放此類動畫且沒有在 onDestroy中去停止動畫,那麼動畫會一直播放下去,儘管已經無法在介面上看見動畫效果了,並且這個時候 Activity的 View會被動畫持有,而View又持有了Activty,最終Activity無法釋放。下面的動畫是無限動畫,會洩露當前的Activity,解決方法是在Activity的onDestroy中呼叫animator.cancel()來停止動畫。