aboutsummaryrefslogtreecommitdiffstats
path: root/java/src/com/android/inputmethod/latin/personalization/DynamicPredictionDictionaryBase.java
diff options
context:
space:
mode:
authorKen Wakasa <kwakasa@google.com>2013-08-16 11:58:57 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2013-08-16 11:58:57 +0000
commitc2f2d0d211fe4c765cda7a770004d061ff2b7711 (patch)
tree3f454173c6a41d8ea79d3df7a78d1661c23961b1 /java/src/com/android/inputmethod/latin/personalization/DynamicPredictionDictionaryBase.java
parente72c4e5fc7531f23f5806efed91aafe5d1ba2d1f (diff)
parent0d70bcc821c22f7001b66f4c7b83842661b8391e (diff)
downloadlatinime-c2f2d0d211fe4c765cda7a770004d061ff2b7711.tar.gz
latinime-c2f2d0d211fe4c765cda7a770004d061ff2b7711.tar.xz
latinime-c2f2d0d211fe4c765cda7a770004d061ff2b7711.zip
Merge "Limit the number of waiting UpdateBinaryTask to at most 1."
Diffstat (limited to 'java/src/com/android/inputmethod/latin/personalization/DynamicPredictionDictionaryBase.java')
-rw-r--r--java/src/com/android/inputmethod/latin/personalization/DynamicPredictionDictionaryBase.java14
1 files changed, 13 insertions, 1 deletions
diff --git a/java/src/com/android/inputmethod/latin/personalization/DynamicPredictionDictionaryBase.java b/java/src/com/android/inputmethod/latin/personalization/DynamicPredictionDictionaryBase.java
index 065e00e4a..525d3cd11 100644
--- a/java/src/com/android/inputmethod/latin/personalization/DynamicPredictionDictionaryBase.java
+++ b/java/src/com/android/inputmethod/latin/personalization/DynamicPredictionDictionaryBase.java
@@ -43,6 +43,7 @@ import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
+import java.util.concurrent.atomic.AtomicReference;
import java.util.concurrent.locks.ReentrantLock;
/**
@@ -75,6 +76,8 @@ public abstract class DynamicPredictionDictionaryBase extends ExpandableDictiona
private final ArrayList<PersonalizationDictionaryUpdateSession> mSessions =
CollectionUtils.newArrayList();
+ private final AtomicReference<AsyncTask<Void, Void, Void>> mWaitingTask;
+
// Should always be false except when we use this class for test
@UsedForTesting boolean mIsTest = false;
@@ -83,6 +86,7 @@ public abstract class DynamicPredictionDictionaryBase extends ExpandableDictiona
super(context, dictionaryType);
mLocale = locale;
mPrefs = sp;
+ mWaitingTask = new AtomicReference<AsyncTask<Void, Void, Void>>();
if (mLocale != null && mLocale.length() > 1) {
loadDictionary();
}
@@ -174,7 +178,11 @@ public abstract class DynamicPredictionDictionaryBase extends ExpandableDictiona
*/
private void flushPendingWrites() {
// Create a background thread to write the pending entries
- new UpdateBinaryTask(mBigramList, mLocale, this, mPrefs, getContext()).execute();
+ final AsyncTask<Void, Void, Void> old = mWaitingTask.getAndSet(new UpdateBinaryTask(
+ mBigramList, mLocale, this, mPrefs, getContext()).execute());
+ if (old != null) {
+ old.cancel(false);
+ }
}
@Override
@@ -287,6 +295,7 @@ public abstract class DynamicPredictionDictionaryBase extends ExpandableDictiona
@Override
protected Void doInBackground(final Void... v) {
+ if (isCancelled()) return null;
if (mDynamicPredictionDictionary.mIsTest) {
// If mIsTest == true, wait until the lock is released.
mDynamicPredictionDictionary.mBigramListLock.lock();
@@ -306,6 +315,9 @@ public abstract class DynamicPredictionDictionaryBase extends ExpandableDictiona
}
private void doWriteTaskLocked() {
+ if (isCancelled()) return;
+ mDynamicPredictionDictionary.mWaitingTask.compareAndSet(this, null);
+
if (DBG_STRESS_TEST) {
try {
Log.w(TAG, "Start stress in closing: " + mLocale);