7
    final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
    final int cacheSize = maxMemory / 8;
    mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {
            @Override
            protected int sizeOf(String key, Bitmap bitmap) {
                // The cache size will be measured in kilobytes rather than
                // number of items.
                return bitmap.getByteCount() / 1024;
            }
        };
    URL url = new URL("http://s2.goodfon.ru/image/260463-1920x1200.jpg");
    Bitmap bitmap = BitmapFactory.decodeStream((InputStream) url.getContent(), null, options);
    if(bitmap != null)
        Log.i("Success", "BITMAP IS NOT NULL");

    String key = "myKey";
    Log.i("Get is null", "putting myKey");
    mMemoryCache.put(key, bitmap);

    Bitmap newBitmap = mMemoryCache.get(key);
    if(newBitmap == null)
        Log.i("newBitmap", "is null");

你好,这里是代码。我成功地从 URL 获取位图(日志说位图不为空,我可以轻松地显示它)。然后我试图将它放入 LruCache 并取回它,但它返回 null。(日志说 newBitmap 为空)。我的错误在哪里?请告诉我。Android 4.1.2 缓存大小 8192 Kb。

4

3 回答 3

8

如果它在磁盘上为 1.19 MB,但在内存中约为 9 MB,这意味着作为压缩的 JPEG 文件,它为 1.19 MB,一旦将其提取到可以显示的位图(未压缩)中,它将占用 9 MB 内存. 如果它是代码片段中的 url 建议的 1920 x 1200 像素图像,则该图像将占用 1920 x 1200 x 4 字节的内存(每个像素 4 字节表示从 0 到 256 乘以 230 万总像素的 ARGB 值= 9,216,000 字节)。如果您为此缓存使用 1/8 的可用内存,则 9MB 可能/很可能超过该总内存空间,因此位图永远不会进入缓存或立即被驱逐。

如果图像那么大,您可能希望在解码时对图像进行下采样(BitmapFactory.Options.inSampleSize如果您还不熟悉,请使用网络上的大量文档来使用它)。

此外,您正在使用 Runtime.maxMemory 来计算缓存大小。这意味着您正在请求允许整个 VM 使用的最大内存量。

http://developer.android.com/reference/java/lang/Runtime.html#maxMemory%28%29

更常见的方法是使用 ActivityManager.getMemoryClass() 方法返回给您的值。

这是一个示例代码片段和文档中的方法定义以供参考。

    ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    int memClassBytes = am.getMemoryClass() * 1024 * 1024;
    int cacheSize = memClassBytes / 8;
    mMemoryCache = new LruCache<String, Bitmap>(cacheSize)

http://developer.android.com/reference/android/app/ActivityManager.html#getMemoryClass%28%29

于 2013-04-04T03:21:59.057 回答
0

您还可以回收从 lrucache 中弹出的位图

final Bitmap bmp = mLruCache.put(key, data);
if (bmp != null)
    bmp.recycle();
于 2013-10-04T15:14:08.220 回答
0

在以下行中将 Runtime maxMemory 除以 1024 时,Android 示例是错误的:

final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);

maxMemory 的单位是 Byte,与 'cacheSize' 相同('/8' 只是表示它将使用当前 Activity 可用内存的八分之一)。因此,'/1024' 将使 'cacheSize' 非常小,以至于在 'mMemoryCache' 中实际上不能“缓存”任何位图。

解决方法是删除上面代码中的'/1024'。

于 2015-04-24T08:58:51.850 回答