aboutsummaryrefslogtreecommitdiffstats
path: root/java/src/com/android/inputmethod
diff options
context:
space:
mode:
authorYuichiro Hanada <yhanada@google.com>2013-08-16 14:17:09 +0900
committerYuichiro Hanada <yhanada@google.com>2013-08-16 19:44:47 +0900
commit0d70bcc821c22f7001b66f4c7b83842661b8391e (patch)
tree52eb0bbd1922c248a5d5f1a7922c178716c45633 /java/src/com/android/inputmethod
parentad4c90934be49e8f0327e865551814a937b4fc1f (diff)
downloadlatinime-0d70bcc821c22f7001b66f4c7b83842661b8391e.tar.gz
latinime-0d70bcc821c22f7001b66f4c7b83842661b8391e.tar.xz
latinime-0d70bcc821c22f7001b66f4c7b83842661b8391e.zip
Limit the number of waiting UpdateBinaryTask to at most 1.
Change-Id: Ia588d8f29ab58983ea5321ff8c63ad273c33eab3
Diffstat (limited to 'java/src/com/android/inputmethod')
-rw-r--r--java/src/com/android/inputmethod/latin/personalization/DynamicPredictionDictionaryBase.java14
-rw-r--r--java/src/com/android/inputmethod/latin/personalization/UserHistoryPredictionDictionary.java3
2 files changed, 15 insertions, 2 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);
diff --git a/java/src/com/android/inputmethod/latin/personalization/UserHistoryPredictionDictionary.java b/java/src/com/android/inputmethod/latin/personalization/UserHistoryPredictionDictionary.java
index d11784454..b8db75f90 100644
--- a/java/src/com/android/inputmethod/latin/personalization/UserHistoryPredictionDictionary.java
+++ b/java/src/com/android/inputmethod/latin/personalization/UserHistoryPredictionDictionary.java
@@ -26,7 +26,8 @@ import android.content.SharedPreferences;
* cancellation or manual picks. This allows the keyboard to adapt to the typist over time.
*/
public class UserHistoryPredictionDictionary extends DynamicPredictionDictionaryBase {
- private static final String NAME = UserHistoryPredictionDictionary.class.getSimpleName();
+ /* package for tests */ static final String NAME =
+ UserHistoryPredictionDictionary.class.getSimpleName();
/* package */ UserHistoryPredictionDictionary(final Context context, final String locale,
final SharedPreferences sp) {
super(context, locale, sp, Dictionary.TYPE_USER_HISTORY);