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の残りの消費可能なメモリを取得するためのツールクラスを書きました.
くだらないことを言わないで直接コードに行きます!
<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>