aboutsummaryrefslogtreecommitdiffstats
path: root/java
diff options
context:
space:
mode:
authorJean Chalard <jchalard@google.com>2011-08-16 19:43:16 +0900
committerJean Chalard <jchalard@google.com>2011-08-16 20:04:57 +0900
commitc160373b6a8e8a536ad8aa2798a33a41d3050f3b (patch)
treeff2cb2b098c74032bc9c3285c7d0ca3540c2987e /java
parent29ea7b79c70ef46e9144c0b12a5e0e681646101d (diff)
downloadlatinime-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.java17
-rw-r--r--java/src/com/android/inputmethod/latin/spellcheck/DictionaryPool.java25
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);
+ }
+ }
}