2014-01-07 5 views
0

안녕하세요 이미지무게를

안드로이드에 구아바를 사용하여이 간단한 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.

구아바보다 약간 더 구성해야하지만 작동해야합니다.

관련 문제