缓存android应用程序的内存

时间:2014-10-14 04:25:25

标签: android performance caching out-of-memory

我总是得到OutOfMemory例外。

我知道问题是我从服务器下载到我的应用程序的位图容量已经超过了缓存内存。

但我不知道Maximum Cache Memory of my application I can stored (images)是多少?

知道的人,

请告诉我,

谢谢,

1 个答案:

答案 0 :(得分:1)

来自doc:

  

移动设备通常具有受限制的系统资源。 Android的   设备可以为单个设备提供少至16MB的内存   应用。 Android兼容性定义文档(CDD),   第3.7节。虚拟机兼容性提供所需的最低要求   适用于各种屏幕尺寸和密度的应用程序内存。   应优化应用程序以在此最小内存下执行   限制。但是,请记住,许多设备配置更高   限制。位图占用大量内存,尤其是对于丰富的图像   喜欢照片。例如,Galaxy Nexus上的相机需要   照片最高可达2592x1936像素(5百万像素)。如果是位图   使用的配置是ARGB_8888(默认来自Android 2.3   然后将此图像加载到内存中需要大约19MB的内存   (2592 * 1936 * 4字节),立即耗尽了每个app的限制   设备

虽然每个应用限制因设备而异,但我认为它大约是16-25 MB。

你应该怎么做?

首先,您必须将图像存储在磁盘上,然后使用下面的功能对其进行解码,然后将其分配给您喜欢的图像视图:

我已将文档中的函数更改为从文件中读取图像而不是从资源文件夹中读取图像。

public static int calculateInSampleSize(
        BitmapFactory.Options options, int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;

if (height > reqHeight || width > reqWidth) {

    final int halfHeight = height / 2;
    final int halfWidth = width / 2;

    // Calculate the largest inSampleSize value that is a power of 2 and keeps both
    // height and width larger than the requested height and width.
    while ((halfHeight / inSampleSize) > reqHeight
            && (halfWidth / inSampleSize) > reqWidth) {
        inSampleSize *= 2;
    }
}

return inSampleSize;
}

public static Bitmap decodeSampledBitmapFromFile(String filePath,int reqWidth, int reqHeight) {

    // First decode with inJustDecodeBounds=true to check dimensions
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(filePath, options);

    // Calculate inSampleSize
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeFile(filePath, options);
}

只需致电decodeSampledBitmapFromFile(String filePath,int reqWidth, int reqHeight)

参考:

Displaying Bitmaps Efficiently

另一种选择是使用图像下载库,比较一下:

Local image caching solution for Android: Square Picasso vs Universal Image Loader

他们只是照顾你的大部分问题。