メモリ最適化を適用するOnLowMemory&OnTrimMemory

8212 ワード

1.アプリケーションメモリonLowMemory&onTrimMemory最適化
onLowMemory&onTrimMemory概要:OnLowMemoryはAndroidが提供するAPIで、システムメモリが不足し、すべてのバックグラウンドプログラム(バックグラウンドで実行されるプロセスではなく優先順位がbackgroundのプロセス)が殺された場合、システムはOnLowMemoryを呼び出す.OnTrimMemoryはAndroid 4.0以降に提供されるAPIで、システムはメモリの状態によってコールバックします.メモリのステータスに応じて、異なるメモリ解放ポリシーに応答します.
1.1 onLowMemory&onTrimMemory最適化、どのようなリソースを解放する必要がありますか?
メモリが不足している場合、OnLowMemory/OpenTrimMemoryがコールバックされ、コールバックメソッドでリソースを解放するコードを記述する必要があります.リソースが緊張している場合、UIで使用されるリソース:Bitmap、配列、コントロールリソースを解放できます.
 
1.2 OnLowMemory
OnLowMemoryはAndroidが提供するAPIで、システムのメモリが不足し、すべてのバックグラウンドプログラム(バックグラウンドで実行されるプロセスではなく優先順位のbackgroundのプロセス)が殺された場合、システムはOnLowMemoryを呼び出す.システムが提供するコールバックは、Application.onLowMemory()Activity.OnLowMemory()Fragement.OnLowMemory()Service.OnLowMemory()ContentProvider.OnLowMemory()は,上記システムが提供するAPIに加えて,ComponentCallbackを独自に実現し,API登録によりOnLowMemoryコールバックを得ることができる.例えば、public static class MyCallback implements ComponentCallback{@Override public void onConfiguration Changed(}@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増加システムにもContext.registerComponentCallback()に登録すると、システムにコールバックされます.
1.4 OnLowMemoryとOnTrimMemoryの比較
1,OnLowMemoryがコールバックされたとき、バックグラウンドプロセスはもうありません.onTrimMemoryがコールバックされると、バックグラウンドプロセスもあります.2,OnLowMemoryは最後のバックグラウンドプロセスが殺されたときに呼び出され、一般的にはlow memory killerがプロセスを殺した後にトリガーされる.一方、OnTrimMemoryのトリガは頻繁で、プロセスの優先度を計算するたびに、条件を満たす限りトリガされます.3,ワンタッチクリーンアップでOnLowMemoryはトリガーされずOnTrimMemoryは一度トリガーされます.使用例:
1 @Override

2 public void onTrimMemory(int level) {

3 Log.e(TAG, " onTrimMemory ... level:" + level); 

6 }

7 

8 @Override

9 public void onLowMemory() { 

11 Log.e(TAG, " onLowMemory ... "); 

13 }

 
2.システムコールバック最適化2.1コールバック原理:Application、Activity、Fragment、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に加えて、ComponentCallbackを独自に実現し、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();

}