Android getApplicationMemory()返回的值不正确?

Android getApplicationMemory()返回的值不正确?,android,Android,根据: 设备实现必须将Dalvik配置为根据 使用上游Android平台,如下表所示。(见 第7.1.1节为屏幕尺寸和屏幕密度定义。) 请注意,下面指定的内存值被视为最小值,而设备 实现可以为每个应用程序分配更多内存。 xlarge xhdpi 128MB 我想知道我的应用程序的可用内存是多少。 不在设备上 我使用了一个大堆=真 为什么我需要知道这些? 我使用一种机制,允许我检查内存中是否适合位图。 //ref:http://stackoverflow.com/questions/60737

根据:

设备实现必须将Dalvik配置为根据
使用上游Android平台,如下表所示。(见
第7.1.1节为屏幕尺寸和屏幕密度定义。)
请注意,下面指定的内存值被视为最小值,而设备
实现可以为每个应用程序分配更多内存。
xlarge xhdpi 128MB
我想知道我的应用程序的可用内存是多少。 不在设备上

我使用了一个大堆=真

为什么我需要知道这些? 我使用一种机制,允许我检查内存中是否适合位图。

//ref:http://stackoverflow.com/questions/6073744/android-how-to-check-how-much-memory-is-remaining
公共静态双可用EMORYMB(活动){
ActivityManager.MemoryInfo mi=新建ActivityManager.MemoryInfo();
ActivityManager ActivityManager=(ActivityManager)activity.getSystemService(activity.activity\u服务);
activityManager.getMemoryInfo(mi);
长期可用性标记=mi.availMem/1048576L;
//老办法
//double max=Runtime.getRuntime().maxMemory()/1024;
//Debug.MemoryInfo MemoryInfo=新建Debug.MemoryInfo();
//Debug.getMemoryInfo(memoryInfo);
返回可用项;
}
公共静态最终长安全存储缓冲区=10//兆字节
公共静态布尔canBitmapFitInMemory(活动,字符串路径){
gc();
long size=getBitmapSizeWithoutDecoding(路径);
Log.d(“图像MB:+大小);
返回大小
我仍然在摆脱记忆错误

您正在检查所有可用内存块的总和是否足以容纳位图。如果没有足够大的可用内存块容纳位图,您将得到一个
OutOfMemoryError

Android没有移动垃圾收集器(Android 5.0+除外,只有当你的应用程序在后台时才会移动)。因此,你的堆将变得碎片化,其中最大的可用空闲块远小于所有可用空闲块的总和

当然欢迎您使用您在问题中使用的算法作为起点。但是,您的处理时间越长,您的算法返回的值就越可能太高。您需要处理
OutOfMemoryError
,然后用较小的位图大小重试。或者,提出一个n用全新的方法解决你的问题


例如,一个104MB的图像,如果是正方形的话,它的侧面将是5221个像素。我知道没有一个Android屏幕接近如此之大。加载一个比屏幕大的位图是毫无意义的。如果你的目标是允许缩小或能够放大,那很好,但是使用一些东西来避免整个位图被放大立即使用内存。

谢谢你,马克。你能给我一些关于Android垃圾如何工作的链接吗?@ssh:不幸的是,官方文档中没有太多关于它的内容。我有关于内存管理的内容。
Device implementations MUST configure Dalvik to allocate memory in accordance
with the upstream Android platform, and as specified by the following table. (See
Section 7.1.1 for screen size and screen density definitions.)
Note that memory values specified below are considered minimum values, and device
implementations MAYallocate more memory per application.

<--Table of memory usage-->
xlarge xhdpi 128MB
//ref:http://stackoverflow.com/questions/6073744/android-how-to-check-how-much-memory-is-remaining
public static double availableMemoryMB(Activity activity) {
    ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo();
    ActivityManager activityManager = (ActivityManager) activity.getSystemService(Activity.ACTIVITY_SERVICE);
    activityManager.getMemoryInfo(mi);
    long availableMegs = mi.availMem / 1048576L;

    // old solution
    // double max = Runtime.getRuntime().maxMemory() / 1024;
    // Debug.MemoryInfo memoryInfo = new Debug.MemoryInfo();
    // Debug.getMemoryInfo(memoryInfo);
    return availableMegs;
}

public static final long SAFETY_MEMORY_BUFFER = 10;//MB

public static boolean canBitmapFitInMemory(Activity activity, String path) {
    System.gc();
    long size = getBitmapSizeWithoutDecoding(path);
    Log.d("image MB:" + size);
    return size <= availableMemoryMB(activity) - SAFETY_MEMORY_BUFFER;
}