附SoftHashmap 的源码一份,相信看过之后,大家会对 Reference 机制的应用有更深入的理解。
- package com. *** .widget;
-
- import java.util. * ;
- import java.lang.ref. * ;
- import android.util.Log;
-
- public class SoftHashMap extends AbstractMap {
-
- private final Map hash = new HashMap();
-
- private final int HARD_SIZE;
-
- private final LinkedList hardCache = new LinkedList();
-
- private ReferenceQueue queue = new ReferenceQueue();
-
- public SoftHashMap() { this ( 100 ); }
- public SoftHashMap( int hardSize) { HARD_SIZE = hardSize; }
-
- public Object get(Object key) {
- Object result = null ;
-
- SoftReference soft_ref = (SoftReference)hash.get(key);
- if (soft_ref != null ) {
-
-
-
- result = soft_ref.get();
- if (result == null ) {
-
-
- hash.remove(key);
- } else {
-
-
-
-
-
-
- hardCache.addFirst(result);
- if (hardCache.size() > HARD_SIZE) {
-
- hardCache.removeLast();
- }
- }
- }
- return result;
- }
-
-
-
-
- private static class SoftValue extends SoftReference {
- private final Object key;
-
-
-
-
-
-
- private SoftValue(Object k, Object key, ReferenceQueue q) {
- super (k, q);
- this .key = key;
- }
- }
-
-
-
-
- public void processQueue() {
- SoftValue sv;
- while ((sv = (SoftValue)queue.poll()) != null ) {
- if (sv.get() == null ) {
- Log.e( " processQueue " , " null " );
- } else {
- Log.e( " processQueue " , " Not null " );
- }
- hash.remove(sv.key);
- Log.e( " SoftHashMap " , " release " + sv.key);
- }
- }
-
-
- public Object put(Object key, Object value) {
- processQueue();
- Log.e( " SoftHashMap " , " put into " + key);
- return hash.put(key, new SoftValue(value, key, queue));
- }
- public Object remove(Object key) {
- processQueue();
- return hash.remove(key);
- }
- public void clear() {
- hardCache.clear();
- processQueue();
- hash.clear();
- }
- public int size() {
- processQueue();
- return hash.size();
- }
- public Set entrySet() {
-
- throw new UnsupportedOperationException();
- }
- }
|