Loading core/java/android/content/res/Resources.java +20 −13 Original line number Diff line number Diff line Loading @@ -68,6 +68,7 @@ import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; import java.io.InputStream; import java.util.Arrays; import java.util.Locale; /** Loading Loading @@ -119,6 +120,9 @@ public class Resources { private static final LongSparseArray<android.content.res.ConstantState<ComplexColor>> sPreloadedComplexColors = new LongSparseArray<>(); /** Size of the cyclical cache used to map XML files to blocks. */ private static final int XML_BLOCK_CACHE_SIZE = 4; // Pool of TypedArrays targeted to this Resources object. final SynchronizedPool<TypedArray> mTypedArrayPool = new SynchronizedPool<>(5); Loading Loading @@ -154,8 +158,9 @@ public class Resources { // Cyclical cache used for recently-accessed XML files. private int mLastCachedXmlBlockIndex = -1; private final String[] mCachedXmlBlockFiles = new String[4]; private final XmlBlock[] mCachedXmlBlocks = new XmlBlock[4]; private final int[] mCachedXmlBlockCookies = new int[XML_BLOCK_CACHE_SIZE]; private final String[] mCachedXmlBlockFiles = new String[XML_BLOCK_CACHE_SIZE]; private final XmlBlock[] mCachedXmlBlocks = new XmlBlock[XML_BLOCK_CACHE_SIZE]; final AssetManager mAssets; final ClassLoader mClassLoader; Loading Loading @@ -2339,18 +2344,18 @@ public class Resources { * tools. */ public final void flushLayoutCache() { final String[] cachedXmlBlockFiles = mCachedXmlBlockFiles; synchronized (mCachedXmlBlocks) { Arrays.fill(mCachedXmlBlockCookies, 0); Arrays.fill(mCachedXmlBlockFiles, null); final XmlBlock[] cachedXmlBlocks = mCachedXmlBlocks; synchronized (cachedXmlBlockFiles) { final int num = cachedXmlBlockFiles.length; for (int i = 0; i < num; i++) { for (int i = 0; i < XML_BLOCK_CACHE_SIZE; i++) { final XmlBlock oldBlock = cachedXmlBlocks[i]; if (oldBlock != null) { oldBlock.close(); } cachedXmlBlockFiles[i] = null; cachedXmlBlocks[i] = null; } Arrays.fill(cachedXmlBlocks, null); } } Loading Loading @@ -2852,13 +2857,14 @@ public class Resources { int assetCookie, @NonNull String type) throws NotFoundException { if (id != 0) { try { synchronized (mCachedXmlBlocks) { final int[] cachedXmlBlockCookies = mCachedXmlBlockCookies; final String[] cachedXmlBlockFiles = mCachedXmlBlockFiles; final XmlBlock[] cachedXmlBlocks = mCachedXmlBlocks; synchronized (cachedXmlBlockFiles) { // First see if this block is in our cache. final int num = cachedXmlBlockFiles.length; for (int i = 0; i < num; i++) { if (cachedXmlBlockFiles[i] != null if (cachedXmlBlockCookies[i] == assetCookie && cachedXmlBlockFiles[i] != null && cachedXmlBlockFiles[i].equals(file)) { return cachedXmlBlocks[i].newParser(); } Loading @@ -2874,6 +2880,7 @@ public class Resources { if (oldBlock != null) { oldBlock.close(); } cachedXmlBlockCookies[pos] = assetCookie; cachedXmlBlockFiles[pos] = file; cachedXmlBlocks[pos] = block; return block.newParser(); Loading Loading
core/java/android/content/res/Resources.java +20 −13 Original line number Diff line number Diff line Loading @@ -68,6 +68,7 @@ import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; import java.io.InputStream; import java.util.Arrays; import java.util.Locale; /** Loading Loading @@ -119,6 +120,9 @@ public class Resources { private static final LongSparseArray<android.content.res.ConstantState<ComplexColor>> sPreloadedComplexColors = new LongSparseArray<>(); /** Size of the cyclical cache used to map XML files to blocks. */ private static final int XML_BLOCK_CACHE_SIZE = 4; // Pool of TypedArrays targeted to this Resources object. final SynchronizedPool<TypedArray> mTypedArrayPool = new SynchronizedPool<>(5); Loading Loading @@ -154,8 +158,9 @@ public class Resources { // Cyclical cache used for recently-accessed XML files. private int mLastCachedXmlBlockIndex = -1; private final String[] mCachedXmlBlockFiles = new String[4]; private final XmlBlock[] mCachedXmlBlocks = new XmlBlock[4]; private final int[] mCachedXmlBlockCookies = new int[XML_BLOCK_CACHE_SIZE]; private final String[] mCachedXmlBlockFiles = new String[XML_BLOCK_CACHE_SIZE]; private final XmlBlock[] mCachedXmlBlocks = new XmlBlock[XML_BLOCK_CACHE_SIZE]; final AssetManager mAssets; final ClassLoader mClassLoader; Loading Loading @@ -2339,18 +2344,18 @@ public class Resources { * tools. */ public final void flushLayoutCache() { final String[] cachedXmlBlockFiles = mCachedXmlBlockFiles; synchronized (mCachedXmlBlocks) { Arrays.fill(mCachedXmlBlockCookies, 0); Arrays.fill(mCachedXmlBlockFiles, null); final XmlBlock[] cachedXmlBlocks = mCachedXmlBlocks; synchronized (cachedXmlBlockFiles) { final int num = cachedXmlBlockFiles.length; for (int i = 0; i < num; i++) { for (int i = 0; i < XML_BLOCK_CACHE_SIZE; i++) { final XmlBlock oldBlock = cachedXmlBlocks[i]; if (oldBlock != null) { oldBlock.close(); } cachedXmlBlockFiles[i] = null; cachedXmlBlocks[i] = null; } Arrays.fill(cachedXmlBlocks, null); } } Loading Loading @@ -2852,13 +2857,14 @@ public class Resources { int assetCookie, @NonNull String type) throws NotFoundException { if (id != 0) { try { synchronized (mCachedXmlBlocks) { final int[] cachedXmlBlockCookies = mCachedXmlBlockCookies; final String[] cachedXmlBlockFiles = mCachedXmlBlockFiles; final XmlBlock[] cachedXmlBlocks = mCachedXmlBlocks; synchronized (cachedXmlBlockFiles) { // First see if this block is in our cache. final int num = cachedXmlBlockFiles.length; for (int i = 0; i < num; i++) { if (cachedXmlBlockFiles[i] != null if (cachedXmlBlockCookies[i] == assetCookie && cachedXmlBlockFiles[i] != null && cachedXmlBlockFiles[i].equals(file)) { return cachedXmlBlocks[i].newParser(); } Loading @@ -2874,6 +2880,7 @@ public class Resources { if (oldBlock != null) { oldBlock.close(); } cachedXmlBlockCookies[pos] = assetCookie; cachedXmlBlockFiles[pos] = file; cachedXmlBlocks[pos] = block; return block.newParser(); Loading