diff options
| author | 2016-06-27 23:11:32 +0000 | |
|---|---|---|
| committer | 2016-06-27 23:11:33 +0000 | |
| commit | bdad0ccf3bbcf2eec39ec03cd65fa450281a6c82 (patch) | |
| tree | 3c84a8fb8f5614116ffa1ddf9be61f2ee4882061 | |
| parent | 11858f170acb1a89905047bbf0039e0582a5b4d2 (diff) | |
| parent | 6aec452f91868c42b9dee156e9d2e22d1a1e5566 (diff) | |
Merge "Fix AttributeCache" into nyc-mr1-dev
| -rw-r--r-- | services/core/java/com/android/server/AttributeCache.java | 27 |
1 files changed, 12 insertions, 15 deletions
diff --git a/services/core/java/com/android/server/AttributeCache.java b/services/core/java/com/android/server/AttributeCache.java index 57f18c086c56..58ec836547a7 100644 --- a/services/core/java/com/android/server/AttributeCache.java +++ b/services/core/java/com/android/server/AttributeCache.java @@ -25,23 +25,24 @@ import android.content.res.Resources; import android.content.res.TypedArray; import android.os.UserHandle; import android.util.ArrayMap; +import android.util.LruCache; import android.util.SparseArray; import com.android.internal.annotations.GuardedBy; -import java.lang.ref.WeakReference; - /** * TODO: This should be better integrated into the system so it doesn't need * special calls from the activity manager to clear it. */ public final class AttributeCache { + private static final int CACHE_SIZE = 4; private static AttributeCache sInstance = null; private final Context mContext; @GuardedBy("this") - private final ArrayMap<String, WeakReference<Package>> mPackages = new ArrayMap<>(); + private final LruCache<String, Package> mPackages = new LruCache<>(CACHE_SIZE); + @GuardedBy("this") private final Configuration mConfiguration = new Configuration(); @@ -86,15 +87,12 @@ public final class AttributeCache { public void removePackage(String packageName) { synchronized (this) { - final WeakReference<Package> ref = mPackages.remove(packageName); - final Package pkg = (ref != null) ? ref.get() : null; + final Package pkg = mPackages.remove(packageName); if (pkg != null) { - if (pkg.mMap != null) { - for (int i = 0; i < pkg.mMap.size(); i++) { - final ArrayMap<int[], Entry> map = pkg.mMap.valueAt(i); - for (int j = 0; j < map.size(); j++) { - map.valueAt(j).recycle(); - } + for (int i = 0; i < pkg.mMap.size(); i++) { + final ArrayMap<int[], Entry> map = pkg.mMap.valueAt(i); + for (int j = 0; j < map.size(); j++) { + map.valueAt(j).recycle(); } } @@ -113,15 +111,14 @@ public final class AttributeCache { // The configurations being masked out are ones that commonly // change so we don't want flushing the cache... all others // will flush the cache. - mPackages.clear(); + mPackages.evictAll(); } } } public Entry get(String packageName, int resId, int[] styleable, int userId) { synchronized (this) { - WeakReference<Package> ref = mPackages.get(packageName); - Package pkg = (ref != null) ? ref.get() : null; + Package pkg = mPackages.get(packageName); ArrayMap<int[], Entry> map = null; Entry ent = null; if (pkg != null) { @@ -144,7 +141,7 @@ public final class AttributeCache { return null; } pkg = new Package(context); - mPackages.put(packageName, new WeakReference<>(pkg)); + mPackages.put(packageName, pkg); } if (map == null) { |