diff options
author | 2011-08-16 19:43:16 +0900 | |
---|---|---|
committer | 2011-08-16 20:04:57 +0900 | |
commit | c160373b6a8e8a536ad8aa2798a33a41d3050f3b (patch) | |
tree | ff2cb2b098c74032bc9c3285c7d0ca3540c2987e /java | |
parent | 29ea7b79c70ef46e9144c0b12a5e0e681646101d (diff) | |
download | latinime-c160373b6a8e8a536ad8aa2798a33a41d3050f3b.tar.gz latinime-c160373b6a8e8a536ad8aa2798a33a41d3050f3b.tar.xz latinime-c160373b6a8e8a536ad8aa2798a33a41d3050f3b.zip |
Close dictionary pools when they are not used any more.
Bug: 5156851
Change-Id: Icaba54734eb790b40dc2012aac25df5b2af71dbb
Diffstat (limited to 'java')
-rw-r--r-- | java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java | 17 | ||||
-rw-r--r-- | java/src/com/android/inputmethod/latin/spellcheck/DictionaryPool.java | 25 |
2 files changed, 39 insertions, 3 deletions
diff --git a/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java index c71841042..649774d78 100644 --- a/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java +++ b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java @@ -16,6 +16,7 @@ package com.android.inputmethod.latin.spellcheck; +import android.content.Intent; import android.content.res.Resources; import android.service.textservice.SpellCheckerService; import android.service.textservice.SpellCheckerService.Session; @@ -48,7 +49,7 @@ public class AndroidSpellCheckerService extends SpellCheckerService { private static final int POOL_SIZE = 2; private final static String[] emptyArray = new String[0]; - private final Map<String, DictionaryPool> mDictionaryPools = + private Map<String, DictionaryPool> mDictionaryPools = Collections.synchronizedMap(new TreeMap<String, DictionaryPool>()); @Override @@ -104,6 +105,16 @@ public class AndroidSpellCheckerService extends SpellCheckerService { } } + @Override + public boolean onUnbind(final Intent intent) { + final Map<String, DictionaryPool> oldPools = mDictionaryPools; + mDictionaryPools = Collections.synchronizedMap(new TreeMap<String, DictionaryPool>()); + for (DictionaryPool pool : oldPools.values()) { + pool.close(); + } + return false; + } + private DictionaryPool getDictionaryPool(final String locale) { DictionaryPool pool = mDictionaryPools.get(locale); if (null == pool) { @@ -167,7 +178,9 @@ public class AndroidSpellCheckerService extends SpellCheckerService { dictInfo.mDictionary.getWords(composer, suggestionsGatherer, dictInfo.mProximityInfo); isInDict = dictInfo.mDictionary.isValidWord(text); - mDictionaryPool.offer(dictInfo); + if (!mDictionaryPool.offer(dictInfo)) { + Log.e(TAG, "Can't re-insert a dictionary into its pool"); + } } catch (InterruptedException e) { // I don't think this can happen. return new SuggestionsInfo(0, new String[0]); diff --git a/java/src/com/android/inputmethod/latin/spellcheck/DictionaryPool.java b/java/src/com/android/inputmethod/latin/spellcheck/DictionaryPool.java index dfbfcc7f6..ee294f6b0 100644 --- a/java/src/com/android/inputmethod/latin/spellcheck/DictionaryPool.java +++ b/java/src/com/android/inputmethod/latin/spellcheck/DictionaryPool.java @@ -28,7 +28,8 @@ public class DictionaryPool extends LinkedBlockingQueue<DictAndProximity> { private final AndroidSpellCheckerService mService; private final int mMaxSize; private final Locale mLocale; - private int mSize = 0; + private int mSize; + private volatile boolean mClosed; public DictionaryPool(final int maxSize, final AndroidSpellCheckerService service, final Locale locale) { @@ -36,6 +37,8 @@ public class DictionaryPool extends LinkedBlockingQueue<DictAndProximity> { mMaxSize = maxSize; mService = service; mLocale = locale; + mSize = 0; + mClosed = false; } @Override @@ -52,4 +55,24 @@ public class DictionaryPool extends LinkedBlockingQueue<DictAndProximity> { } } } + + public void close() { + synchronized(this) { + mClosed = true; + for (DictAndProximity dict : this) { + dict.mDictionary.close(); + } + clear(); + } + } + + @Override + public boolean offer(final DictAndProximity dict) { + if (mClosed) { + dict.mDictionary.close(); + return false; + } else { + return super.offer(dict); + } + } } |