Merge "Fix leaky view tags"

This commit is contained in:
Adam Powell
2011-09-23 11:05:25 -07:00
committed by Android (Google) Code Review

View File

@@ -81,7 +81,6 @@ import java.lang.reflect.Method;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Locale; import java.util.Locale;
import java.util.WeakHashMap;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;
/** /**
@@ -1497,12 +1496,7 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal
/** /**
* Map used to store views' tags. * Map used to store views' tags.
*/ */
private static WeakHashMap<View, SparseArray<Object>> sTags; private SparseArray<Object> mKeyedTags;
/**
* Lock used to access sTags.
*/
private static final Object sTagsLock = new Object();
/** /**
* The next available accessiiblity id. * The next available accessiiblity id.
@@ -12236,14 +12230,7 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal
* @see #getTag() * @see #getTag()
*/ */
public Object getTag(int key) { public Object getTag(int key) {
SparseArray<Object> tags = null; if (mKeyedTags != null) return mKeyedTags.get(key);
synchronized (sTagsLock) {
if (sTags != null) {
tags = sTags.get(this);
}
}
if (tags != null) return tags.get(key);
return null; return null;
} }
@@ -12276,7 +12263,7 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal
+ "resource id."); + "resource id.");
} }
setTagInternal(this, key, tag); setKeyedTag(this, key, tag);
} }
/** /**
@@ -12291,27 +12278,15 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal
+ "resource id."); + "resource id.");
} }
setTagInternal(this, key, tag); setKeyedTag(this, key, tag);
} }
private static void setTagInternal(View view, int key, Object tag) { private void setKeyedTag(View view, int key, Object tag) {
SparseArray<Object> tags = null; if (mKeyedTags == null) {
synchronized (sTagsLock) { mKeyedTags = new SparseArray<Object>();
if (sTags == null) {
sTags = new WeakHashMap<View, SparseArray<Object>>();
} else {
tags = sTags.get(view);
}
} }
if (tags == null) { mKeyedTags.put(key, tag);
tags = new SparseArray<Object>(2);
synchronized (sTagsLock) {
sTags.put(view, tags);
}
}
tags.put(key, tag);
} }
/** /**