2014-01-07 82 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

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