2014-01-07 55 views
0

你好,我有使用番石榴在Android上的图像如何使用改变番石榴缓存驱逐策略秤

这个简单的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(); 

当项目是从缓存中删除,它删除了未使用的时间最长的项目第一。我想改变这一点,这是删除最重的第一项。可能吗 ?

+2

['CacheBuilder' javadoc](http://docs.guava-libraries.googlecode.com/git/javadoc/index.html?com/google/common/cache/CacheBuilder.html)确实规定驱逐当达到最大尺寸(或重量)时是基于LRU的。它还表示(对于'maximumWeight()')_“请注意,权重仅用于确定缓存是否超出容量;对选择下一个应该被逐出的条目没有影响。 –

回答

1

您可以尝试使用Ehacache执行此任务。

  1. 重写Element类的isExpired()方法(以及在那里提供你的体重逻辑):所希望的功能可以通过执行。然后,不要将常用的Element添加到缓存中,而是添加扩展类的实例。
  2. 附加CacheEventListener

它可能需要比番石榴更多的配置,但仍然应该工作。