根据Android 4.2 specification(Block 3.7):
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
我想知道我的应用程序的可用内存是多少。 不在设备上!
我使用largeHeap = true
我使用的机制允许我检查内存中的拟合位图或否。
//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;
}
我的图片大小为104 MB。可用内存为286 MB。我仍然得到OutOfMemoryError。
也许我检查不是应用程序内存?
答案 0 :(得分:0)
我仍然得到OutOfMemoryError。
您正在检查所有可用内存块的总和是否足以容纳您的位图。如果没有单个空闲内存块足以容纳您的位图,您将获得OutOfMemoryError
。
Android没有移动垃圾收集器(Android 5.0+除外,只有当你的应用程序在后台时)。结果,您的堆将变得碎片化,其中最大可用空闲块远小于所有可用空闲块的总和。
当然欢迎您使用您在问题中使用的算法作为起点。但是,您的进程越长,您的算法返回的值就越高。您需要处理OutOfMemoryError
并再次尝试使用较小的位图大小。或者,完全找出解决问题的新方法。
例如,104MB图像(如果是正方形)在一侧为5221像素。我知道没有任何Android屏幕可以接近那么大。加载比屏幕大的位图是没有意义的。如果您的目标是允许缩放或某些内容可以放大,那很好,但是然后使用like SubsamplingScaleImageView
来避免一次将整个位图放在内存中。