android 應用記憶體優化之OnLowMemory&OnTrimMemory

銳湃發表於2015-08-25

1.應用記憶體onLowMemory& onTrimMemory優化


onLowMemory& onTrimMemory簡介:
OnLowMemory是Android提供的API,在系統記憶體不足,所有後臺程式(優先順序為background的程式,不是指後臺執行的程式)都被殺死時,系統會呼叫OnLowMemory。
OnTrimMemory是Android 4.0之後提供的API,系統會根據不同的記憶體狀態來回撥。根據不同的記憶體狀態,來響應不同的記憶體釋放策略。


1.1 onLowMemory& onTrimMemory優化,需要釋放什麼資源?


在記憶體緊張的時候,會回撥OnLowMemory/OnTrimMemory,需要在回撥方法中編寫釋放資源的程式碼。
可以在資源緊張的時候,釋放UI 使用的資源資:Bitmap、陣列、控制元件資源。

 

1.2 OnLowMemory


OnLowMemory是Android提供的API,在系統記憶體不足,所有後臺程式(優先順序為background的程式,不是指後臺執行的程式)都被殺死時,系統會呼叫OnLowMemory。系統提供的回撥有:
Application.onLowMemory()
Activity.OnLowMemory()
Fragement.OnLowMemory()
Service.OnLowMemory()
ContentProvider.OnLowMemory()
除了上述系統提供的API,還可以自己實現ComponentCallbacks,通過API註冊,這樣也能得到OnLowMemory回撥。例如:
public static class MyCallback implements ComponentCallbacks {
@Override
public void onConfigurationChanged(Configuration arg) {
}

@Override
public void onLowMemory() {
//do release operation
}
}
然後,通過Context.registerComponentCallbacks ()在合適的時候註冊回撥就可以了。通過這種自定義的方法,可以在很多地方註冊回撥,而不需要侷限於系統提供的元件。
onLowMemory 當後臺程式已經終止資源還匱乏時會呼叫這個方法。好的應用程式一般會在這個方法裡面釋放一些不必要的資源來應付當後臺程式已經終止,前臺應用程式記憶體還不夠時的情況。


1.3 OnTrimMemory


OnTrimMemory是Android 4.0之後提供的API,系統會根據不同的記憶體狀態來回撥。系統提供的回撥有:
Application.onTrimMemory()
Activity.onTrimMemory()
Fragement.OnTrimMemory()
Service.onTrimMemory()
ContentProvider.OnTrimMemory()
OnTrimMemory的引數是一個int數值,代表不同的記憶體狀態:
TRIM_MEMORY_COMPLETE:記憶體不足,並且該程式在後臺程式列表最後一個,馬上就要被清理
TRIM_MEMORY_MODERATE:記憶體不足,並且該程式在後臺程式列表的中部。
TRIM_MEMORY_BACKGROUND:記憶體不足,並且該程式是後臺程式。
TRIM_MEMORY_UI_HIDDEN:記憶體不足,並且該程式的UI已經不可見了。 
以上4個是4.0增加
TRIM_MEMORY_RUNNING_CRITICAL:記憶體不足(後臺程式不足3個),並且該程式優先順序比較高,需要清理記憶體
TRIM_MEMORY_RUNNING_LOW:記憶體不足(後臺程式不足5個),並且該程式優先順序比較高,需要清理記憶體
TRIM_MEMORY_RUNNING_MODERATE:記憶體不足(後臺程式超過5個),並且該程式優先順序比較高,需要清理記憶體 
以上3個是4.1增加
系統也提供了一個ComponentCallbacks2,通過Context.registerComponentCallbacks()註冊後,就會被系統回撥到。

1.4 OnLowMemory和OnTrimMemory的比較

1,OnLowMemory被回撥時,已經沒有後臺程式;而onTrimMemory被回撥時,還有後臺程式。
2,OnLowMemory是在最後一個後臺程式被殺時呼叫,一般情況是low memory killer 殺程式後觸發;而OnTrimMemory的觸發更頻繁,每次計算程式優先順序時,只要滿足條件,都會觸發。
3,通過一鍵清理後,OnLowMemory不會被觸發,而OnTrimMemory會被觸發一次。

使用舉例:

@Override
public void onTrimMemory(int level) {
Log.e(TAG, " onTrimMemory ... level:" + level); 
}

@Override
public void onLowMemory() { 
Log.e(TAG, " onLowMemory ... "); 
}

2.系統回撥優化
2.1 回撥原理:
在Application、 Activity、Fragement、Service、ContentProvider中都可以重寫回撥方法,對OnLowMemory/OnTrimMemory進行回撥,在回撥方法中實現資源釋放的實現。
以Activity為例,在Activity原始碼中能夠看到對於onTrimMemory的定義,因此在回撥的時候重寫方法即可。

 

public void onTrimMemory(int level) {
if (DEBUG_LIFECYCLE) Slog.v(TAG, "onTrimMemory " + this + ": " + level);
mCalled = true;
mFragments.dispatchTrimMemory(level);
}

2.2 釋放資源:
在onTrimMemory釋放資源,釋放圖片、陣列、快取等資源。

@Override
public void onTrimMemory(int level) {
// TODO Auto-generated method stub
DLog.d(" onTrimMemory ... level:" + level);

switch(level)

{
case TRIM_MEMORY_UI_HIDDEN: 
//釋放資源
/*編寫釋放資原始碼*/
}

break;
}
super.onTrimMemory(level);
}

下面是釋放Bitmap的示例程式碼片段:

// 先判斷是否已經回收
if(bitmap != null && !bitmap.isRecycled()){ 
// 回收並且置為null
bitmap.recycle(); 
bitmap = null; 
} 
System.gc();

list佔用方法:
list.clear();然後在置空。


3.實現ComponentCallbacks


OnLowMemory除了上述系統提供的API,還可以自己實現ComponentCallbacks,通過API註冊,這樣也能得到OnLowMemory回撥。例如:

public static class ViewComponentCallbacks implements ComponentCallbacks {
@Override
public void onConfigurationChanged(Configuration arg) {
}

@Override
public void onLowMemory() {
//do release operation
}
}
註冊自定義的回撥類:

ViewComponentCallbacks callBacks =new ViewComponentCallbacks();
this.registerComponentCallbacks( callBacks );

回撥之後,即可進行重寫:

@Override
public void onLowMemory() {
// TODO Auto-generated method stub
//釋放資源的方法
super.onLowMemory();
}

轉自:http://www.cnblogs.com/xiajf/p/3993599.html

相關文章