Androidメモリ検出実装
Androidメモリ検出を実現する役割はどこですか?
非常に大きな画像のスケーリングを処理すると、ARGB 8888の色が使用されるため、1画素が4 Byteになります.1つ2000×3000解像度の画像で消費されるメモリは、2343.75 KBです.このとき消費されるメモリは23.4 Mです.android2.2公式ROMの最大メモリは24 Mです.では、美図秀秀秀を開き、2000画素の図を処理するときに問題が発生します.4.0公式ROMの場合、あなたのappの最大メモリ制限は64 M、4.4の場合、メモリ制限は96 Mです.それほど大きくないので、メモリはまだ緊張しています.
このとき、一部の携帯電話ではOOMが発生します.
だから、このような状況に遭遇したとき、まずメモリを申請できるかどうかをチェックする必要があります.
PS:現在、多くのROMメーカーが最大メモリ制限を修正しています.私はL 36 Hをテストしました.メモリ制限は256 MBです.これにより、より多くのメモリを使用できます.しかし、まだ多くのブランドが修正されていません.サムスンは4.0 4.2を修正していません.いずれも64 Mで、motoもありません.Nexusシリーズは修正されていません.
ここでは、携帯電話の残りのメモリとappの残りの消費可能なメモリを取得するためのツールクラスを書きました.
くだらないことを言わないで直接コードに行きます!
非常に大きな画像のスケーリングを処理すると、ARGB 8888の色が使用されるため、1画素が4 Byteになります.1つ2000×3000解像度の画像で消費されるメモリは、2343.75 KBです.このとき消費されるメモリは23.4 Mです.android2.2公式ROMの最大メモリは24 Mです.では、美図秀秀秀を開き、2000画素の図を処理するときに問題が発生します.4.0公式ROMの場合、あなたのappの最大メモリ制限は64 M、4.4の場合、メモリ制限は96 Mです.それほど大きくないので、メモリはまだ緊張しています.
このとき、一部の携帯電話ではOOMが発生します.
だから、このような状況に遭遇したとき、まずメモリを申請できるかどうかをチェックする必要があります.
PS:現在、多くのROMメーカーが最大メモリ制限を修正しています.私はL 36 Hをテストしました.メモリ制限は256 MBです.これにより、より多くのメモリを使用できます.しかし、まだ多くのブランドが修正されていません.サムスンは4.0 4.2を修正していません.いずれも64 Mで、motoもありません.Nexusシリーズは修正されていません.
ここでは、携帯電話の残りのメモリとappの残りの消費可能なメモリを取得するためのツールクラスを書きました.
くだらないことを言わないで直接コードに行きます!
<span style="font-size:14px;">package com.commons.utils.memory;
import android.annotation.TargetApi;
import android.app.ActivityManager;
import android.content.Context;
import android.os.Build;
import android.util.Log;
/**
*
*/
public class MemoryUtils {
private static final String TAG="MemoryUtils";
/**
*
*/
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public static void printMemoryInfo()
{
final String TAG="MemoryUtils.printMemoryInfo()";
// APP
// android:largeHeap="true" ,
//
Runtime rt = Runtime.getRuntime();
Log.d(TAG, "APP : :" + rt.maxMemory() / 1024/1024 +"MB :" + rt.totalMemory() / 1024/1024 + "MB :"+rt.freeMemory()/1024/1024+"MB");
}
/**
* app try,catch
*/
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static long getAppSurplusMe()
{
final String TAG="MemoryUtils.getAppSurplusMe()";
Runtime rt = Runtime.getRuntime();
//
long totalMemory=rt.totalMemory();// ,
long maxMemory=rt.maxMemory();//
long freeMemory=rt.freeMemory();
// 64M, 34M, 4M, :(34-4)M, :64-(34-4)=34;
//64-(34-4)=34 :" " 64-34+4
//so
long surplusMemory=maxMemory-totalMemory+freeMemory;
Log.d(TAG, " : :" + rt.maxMemory() / 1024/1024 +"MB :" + rt.totalMemory() / 1024/1024 + "MB :"+rt.freeMemory()/1024/1024+"MB");
return surplusMemory;
}
/**
* try,catch,
*
*
*
* @param context
* @return
*/
public static long getPhoneSurplusMe(Context context)
{
ActivityManager am = (ActivityManager)context.getSystemService(context.ACTIVITY_SERVICE);
ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo();
am.getMemoryInfo(mi);
return mi.availMem;
}
}</span>