Android內存檢測實現

b5pp 9年前發布 | 2K 次閱讀 Java Android

實現android內存檢測的作用在哪里?

當你處理一個非常大的圖片縮放的時候,由于使用了ARGB8888的色彩,導致一個像素是4Byte。一個2000×3000分辨率的圖片消耗的內存是:23 437.5KB。這時候消耗的內存是2.3M的內存。android2.2官方ROM最大內存是24M,那么打開美圖秀秀,處理一張2000像素的圖的時候就會發生問題, 4.0官方ROM的話,你的app最大內存限制是64M,4.4的時候,內存限制是96M。都不是很大,所以內存還是很緊張的。

這時候在一些手機上就會出現OOM的情況。

所以,在遇到這種情況的時候需要先檢測下還能不能再申請內存了!

PS:現在很多ROM廠商都修改了最大內存限制,我做過測試我的L36H,內存限制是256MB。這樣的話可以使用更多的內存。但是還有很多品牌沒有做修改,三星是沒有修改4.0  4.2都是64M,moto也沒有,Nexus 系列更是 沒有修改。



這里我寫了個工具類,供使用的時候操作,獲取手機剩余內存和app的剩余可消耗的內存。


廢話不說直接上代碼!

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;  
}  

}</pre>

 來自:http://blog.csdn.net/weizongwei5/article/details/41894783


 本文由用戶 b5pp 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!