From d2e91d1dc7c9fcbf792cbc21d283a5915b32cb54 Mon Sep 17 00:00:00 2001 From: Ben Murdoch Date: Fri, 25 Feb 2011 17:11:02 +0000 Subject: [PATCH] Improve caching of localised strings for Chromium We read localised strings for Chromium (e.g. for Autofill) from Java. Now we've added more large strings, keep them in WeakReferences and load them lazily rather than on startup. Change-Id: Ibedcaab5ee781699b41b5c03aae866d1d82bb570 --- core/java/android/webkit/L10nUtils.java | 35 +++++++++++++++++-------- core/java/android/webkit/WebView.java | 2 +- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/core/java/android/webkit/L10nUtils.java b/core/java/android/webkit/L10nUtils.java index 43a747ad66420..f59d7d0d6a082 100644 --- a/core/java/android/webkit/L10nUtils.java +++ b/core/java/android/webkit/L10nUtils.java @@ -18,8 +18,9 @@ package android.webkit; import android.content.Context; -import java.util.List; -import java.util.Vector; +import java.lang.ref.SoftReference; +import java.util.Map; +import java.util.HashMap; /** * @hide @@ -71,20 +72,32 @@ public class L10nUtils { com.android.internal.R.string.autofill_card_ignored_re // IDS_AUTOFILL_CARD_IGNORED_RE }; - private static List mStrings; + private static Context mApplicationContext; + private static Map > mStrings; - public static void loadStrings(Context context) { - if (mStrings != null) { - return; + public static void setApplicationContext(Context applicationContext) { + mApplicationContext = applicationContext.getApplicationContext(); + } + + private static String loadString(int id) { + if (mStrings == null) { + mStrings = new HashMap >(mIdsArray.length); } - mStrings = new Vector(mIdsArray.length); - for (int i = 0; i < mIdsArray.length; i++) { - mStrings.add(context.getResources().getString(mIdsArray[i])); - } + String localisedString = mApplicationContext.getResources().getString(mIdsArray[id]); + mStrings.put(id, new SoftReference(localisedString)); + return localisedString; } public static String getLocalisedString(int id) { - return mStrings.get(id); + if (mStrings == null) { + // This is the first time we need a localised string. + // loadString will create the Map. + return loadString(id); + } + + SoftReference ref = mStrings.get(id); + boolean needToLoad = ref == null || ref.get() == null; + return needToLoad ? loadString(id) : ref.get(); } } diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index 98fc29022a93c..9be911c2302d5 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -987,7 +987,7 @@ public class WebView extends AbsoluteLayout mCallbackProxy = new CallbackProxy(context, this); mViewManager = new ViewManager(this); - L10nUtils.loadStrings(context); + L10nUtils.setApplicationContext(context.getApplicationContext()); mWebViewCore = new WebViewCore(context, this, mCallbackProxy, javaScriptInterfaces); mDatabase = WebViewDatabase.getInstance(context); mScroller = new OverScroller(context, null, 0, 0, false); //TODO Use OverScroller's flywheel