-1

我正在寻找解决方案来防止 Android 上出现 OutOfMemory 错误。搜索 OutOfMemory 时的大部分主题是关于我不使用的位图。我的问题是将大量数据从数据库加载到表单。我需要允许在一个视图(活动)中添加多个表单。但是如果我加载太多数据,我最终会得到 OutOfMemory。我怎样才能防止这种情况?我怎么知道我不应该加载更多数据,因为我会得到 OutOfMemory ?

4

2 回答 2

0

您可以在 a 中显示表单并在用户通过适配器ListView滚动时动态加载适当的数据。getView

我怎么知道我不应该加载更多数据,因为我会得到 OutOfMemory ?

一般来说,对于大量数据,您应该根据需要加载,并在未显示或不必要时丢弃,因此您需要在应用程序中确定这些点。

我有这个调试功能,我在分配大量图像时经常使用它。您可以使用它来查看内存何时耗尽,并根据需要对其进行调整以停止分配更多内存。

synchronized private void debugMemoryUsage() {
    DecimalFormat df = new DecimalFormat();
    df.setMaximumFractionDigits(2);
    df.setMinimumFractionDigits(2);
    // Native heap
    Double allocated = Double.valueOf(Debug.getNativeHeapAllocatedSize())/BYTES_PER_MB;
    Double available = Double.valueOf(Debug.getNativeHeapSize())/BYTES_PER_MB;
    Double free = Double.valueOf(Debug.getNativeHeapFreeSize())/BYTES_PER_MB;
    // Runtime 
    Double runtimeTotal = Double.valueOf(Runtime.getRuntime().totalMemory())/BYTES_PER_MB;
    Double runtimeMax = Double.valueOf(Runtime.getRuntime().maxMemory())/BYTES_PER_MB;
    Double runtimeFree = Double.valueOf(Runtime.getRuntime().freeMemory())/BYTES_PER_MB;

    Log.v(Tag.IMAGE_CACHE, "=================================");
    Log.v(Tag.IMAGE_CACHE, "NATIVE HEAP : allocated " + df.format(allocated) + "MB of " + df.format(available) + "MB (" + df.format(free) + "MB free)");
    Log.v(Tag.IMAGE_CACHE, "RUNTIME MEMORY: total : " + df.format(runtimeTotal) + "MB : vm max : " + df.format(runtimeMax)+ "MB : free : " + df.format(runtimeFree) +"MB free");
    Log.v(Tag.IMAGE_CACHE, "*********************************");
}

但根据我的经验,这些数字只是一个估计值,所以你应该保留一个缓冲,所以也许只是分配给 VM 最大值的某个百分比。VM max 是应用程序进程可以分配的最大内存,它与手机不同,在旧手机上可以低至 16MB。

于 2013-10-09T09:39:45.373 回答
0

内存不足是因为图像位图尺寸大,您可以通过缩小用户查看的图像来减少此问题:检查如何缩小

为了防止内存崩溃,将位图保存在 SoftReference 数组中,当到达内存时它会自动清除图像而不是崩溃,在读取图像之前检查是否删除然后重新上传位图到内存:

HashMap<String,SoftReference<Bitmap>> caschedImages;
于 2013-10-09T09:52:30.453 回答