Android Open Source - Android-Display-Images-from-SD-Card-Tutorial Memory Cache






From Project

Back to project page Android-Display-Images-from-SD-Card-Tutorial.

License

The source code is released under:

Apache License

If you think the Android project Android-Display-Images-from-SD-Card-Tutorial listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package com.androidbegin.sdimagetutorial;
/* w w w .  java  2s.com*/
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import android.graphics.Bitmap;
import android.util.Log;

public class MemoryCache {

  private static final String TAG = "MemoryCache";

  // Last argument true for LRU ordering
  private Map<String, Bitmap> cache = Collections
      .synchronizedMap(new LinkedHashMap<String, Bitmap>(10, 1.5f, true));

  // Current allocated size
  private long size = 0;

  // Max memory in bytes
  private long limit = 1000000;

  public MemoryCache() {
    // Use 25% of available heap size
    setLimit(Runtime.getRuntime().maxMemory() / 4);
  }

  public void setLimit(long new_limit) {
    limit = new_limit;
    Log.i(TAG, "MemoryCache will use up to " + limit / 1024. / 1024. + "MB");
  }

  public Bitmap get(String id) {
    try {
      if (!cache.containsKey(id))
        return null;
      return cache.get(id);
    } catch (NullPointerException ex) {
      ex.printStackTrace();
      return null;
    }
  }

  public void put(String id, Bitmap bitmap) {
    try {
      if (cache.containsKey(id))
        size -= getSizeInBytes(cache.get(id));
      cache.put(id, bitmap);
      size += getSizeInBytes(bitmap);
      checkSize();
    } catch (Throwable th) {
      th.printStackTrace();
    }
  }

  private void checkSize() {
    Log.i(TAG, "cache size=" + size + " length=" + cache.size());
    if (size > limit) {
      // Least recently accessed item will be the first one iterated
      Iterator<Entry<String, Bitmap>> iter = cache.entrySet().iterator();
      while (iter.hasNext()) {
        Entry<String, Bitmap> entry = iter.next();
        size -= getSizeInBytes(entry.getValue());
        iter.remove();
        if (size <= limit)
          break;
      }
      Log.i(TAG, "Clean cache. New size " + cache.size());
    }
  }

  public void clear() {
    try {
      cache.clear();
      size = 0;
    } catch (NullPointerException ex) {
      ex.printStackTrace();
    }
  }

  long getSizeInBytes(Bitmap bitmap) {
    if (bitmap == null)
      return 0;
    return bitmap.getRowBytes() * bitmap.getHeight();
  }
}




Java Source Code List

com.androidbegin.sdimagetutorial.ImageLoader.java
com.androidbegin.sdimagetutorial.LazyAdapter.java
com.androidbegin.sdimagetutorial.MainActivity.java
com.androidbegin.sdimagetutorial.MemoryCache.java
com.androidbegin.sdimagetutorial.ViewImage.java