Android代碼內存優化建議 OnTrimMemory

OnTrimMemory 回調是 Android 4.0 以後提供的一個API,這個 API 是提供給開發者的,它的主要做用是提示開發者在系統內存不足的時候,經過處理部分資源來釋放內存,從而避免被 Android 系統殺死。這樣應用在下一次啓動的時候,速度就會比較快。緩存

 

OnTrimMemory回調的做用?架構

OnTrimMemory是Android在4.0以後加入的一個回調,任何實現了ComponentCallbacks2接口的類均可以重寫實現這個回調方法.OnTrimMemory的主要做用就是指導應用程序在不一樣的狀況下進行自身的內存釋放,以免被系統直接殺掉,提升應用程序的用戶體驗.ide

 

Android系統會根據不一樣等級的內存使用狀況,調用這個函數,並傳入對應的等級:函數

TRIM_MEMORY_UI_HIDDEN 表示應用程序的全部UI界面被隱藏了,即用戶點擊了Home鍵或者Back鍵致使應用的UI界面不可見.這時候應該釋放一些資源.性能

TRIM_MEMORY_UI_HIDDEN這個等級比較經常使用,和下面六個的關係不是很強,因此單獨說接口

 

下面三個等級是當咱們的應用程序真正運行時的回調:進程

TRIM_MEMORY_RUNNING_MODERATE 表示應用程序正常運行,而且不會被殺掉。可是目前手機的內存已經有點低了,系統可能會開始根據LRU緩存規則來去殺死進程了。圖片

TRIM_MEMORY_RUNNING_LOW 表示應用程序正常運行,而且不會被殺掉。可是目前手機的內存已經很是低了,咱們應該去釋放掉一些沒必要要的資源以提高系統的性能,同時這也會直接影響到咱們應用程序的性能。內存

TRIM_MEMORY_RUNNING_CRITICAL 表示應用程序仍然正常運行,可是系統已經根據LRU緩存規則殺掉了大部分緩存的進程了。這個時候咱們應當儘量地去釋聽任何沒必要要的資源,否則的話系統可能會繼續殺掉全部緩存中的進程,而且開始殺掉一些原本應當保持運行的進程,好比說後臺運行的服務。資源

 

當應用程序是緩存的,則會收到如下幾種類型的回調:

TRIM_MEMORY_BACKGROUND 表示手機目前內存已經很低了,系統準備開始根據LRU緩存來清理進程。這個時候咱們的程序在LRU緩存列表的最近位置,是不太可能被清理掉的,但這時去釋放掉一些比較容易恢復的資源可以讓手機的內存變得比較充足,從而讓咱們的程序更長時間地保留在緩存當中,這樣當用戶返回咱們的程序時會感受很是順暢,而不是經歷了一次從新啓動的過程。

TRIM_MEMORY_MODERATE 表示手機目前內存已經很低了,而且咱們的程序處於LRU緩存列表的中間位置,若是手機內存還得不到進一步釋放的話,那麼咱們的程序就有被系統殺掉的風險了。

TRIM_MEMORY_COMPLETE 表示手機目前內存已經很低了,而且咱們的程序處於LRU緩存列表的最邊緣位置,系統會最優先考慮殺掉咱們的應用程序,在這個時候應當儘量地把一切能夠釋放的東西都進行釋放。

 

哪些組件能夠實現OnTrimMemory回調?

Application.onTrimMemory()

Activity.onTrimMemory()

Fragement.OnTrimMemory()

Service.onTrimMemory()

ContentProvider.OnTrimMemory()

 

OnTrimMemory回調中能夠釋放哪些資源?

一般在架構階段就要考慮清楚,咱們有哪些東西是要常駐內存的,有哪些是伴隨界面存在的通常狀況下,有下面幾種資源須要進行釋放:

緩存 緩存包括一些文件緩存,圖片緩存等,在用戶正常使用的時候這些緩存頗有做用,但當你的應用程序UI不可見的時候,這些緩存就能夠被清除以減小內存的使用.好比第三方圖片庫的緩存.

一些動態生成動態添加的View. 這些動態生成和添加的View且少數狀況下才使用到的View,這時候能夠被釋放,下次使用的時候再進行動態生成便可.好比原生桌面中,會在OnTrimMemory的TRIM_MEMORY_MODERATE等級中,釋放全部AppsCustomizePagedView的資源,來保證在低內存的時候,桌面不會輕易被殺掉.

 

例子: 清除緩存

@Override

public void onTrimMemory(int level) {

if (level >= ComponentCallbacks2.TRIM_MEMORY_MODERATE) {

// Clear the caches. Note all pending requests will be removed too.

clear();

}

}

 

public void clear() {

mPendingRequests.clear();

mBitmapHolderCache.evictAll();

mBitmapCache.evictAll();

}

 

爲何要調用OnTrimMemory?

儘管系統在內存不足的時候殺進程的順序是按照LRU Cache中從低到高來的,可是它同時也會考慮殺掉那些佔用內存較高的應用來讓系統更快地得到更多的內存。

因此若是你的應用佔用內存較小,就能夠增長不被殺掉的概率,從而快速地恢復(若是不被殺掉,啓動的時候就是熱啓動,不然就是冷啓動,其速度差在2~3倍)。

因此說在幾個不一樣的OnTrimMemory回調中釋放本身的UI資源,能夠有效地提升用戶體驗。

 

http://mp.weixin.qq.com/s?__biz=MzAwNjE5MzA0NQ==&mid=211317365&idx=1&sn=c24d1be87cfe9e2ef341c2347dd5f61b&scene=1#rd

相關文章
相關標籤/搜索