如何使用Weigher改变番石榴缓存驱逐策略

时间:2014-01-07 14:10:08

标签: java caching guava

您好我在Android上使用guava进行图像的简单mem缓存

memCache = CacheBuilder.newBuilder()
                .maximumWeight(Runtime.getRuntime().maxMemory()/MEMORY_POOL)
                .weigher(new Weigher<String, Bitmap>() {
                    @SuppressLint("NewApi")
                    public int weigh(String url, Bitmap bitmap) {
                        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB_MR1) {
                            return bitmap.getRowBytes() * bitmap.getHeight();
                        } else {
                            return bitmap.getByteCount();
                        }
                    }
                })
                .removalListener(new RemovalListener<String, Bitmap>() {
                    @Override
                    public void onRemoval(RemovalNotification<String, Bitmap> objectObjectRemovalNotification) {
                        final Bitmap bitmap = objectObjectRemovalNotification.getValue();
                        if (bitmap != null && !bitmap.isRecycled()) {
                            Log.debug("Cache: recycling bitmap");
                            bitmap.recycle();
                        }
                    }
                })
                .build();

从缓存中删除项目时,会先删除最长时间未使用的项目。我想改变它,以便删除最重量的第一件物品。有可能吗?

1 个答案:

答案 0 :(得分:1)

您可以尝试使用Ehacache执行此任务。所需的功能可以通过以下方式实现:

  1. 覆盖Element类的isExpired()方法(并在其中提供您的权重逻辑)。然后,不是将通常的Element添加到缓存中,而是添加扩展类的实例。
  2. 附加CacheEventListener
  3. 它可能需要比Guava更多的配置,但仍然可以工作。