From d0295ea6e7db5499efd8a71935a834069975d607 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Reimar=20D=C3=B6ffinger?= Date: Sun, 19 Mar 2017 21:39:25 +0100 Subject: [PATCH] Make thread priority setting actually work. Also tune the priority value for better results. --- .../dictionary/DictionaryActivity.java | 27 ++++++++++--------- .../dictionary/DictionaryApplication.java | 11 +++++++- .../android/dictionary/engine/Index.java | 2 +- .../engine/TransliteratorManager.java | 11 +++++++- 4 files changed, 35 insertions(+), 16 deletions(-) diff --git a/src/com/hughes/android/dictionary/DictionaryActivity.java b/src/com/hughes/android/dictionary/DictionaryActivity.java index 084122b..9523215 100644 --- a/src/com/hughes/android/dictionary/DictionaryActivity.java +++ b/src/com/hughes/android/dictionary/DictionaryActivity.java @@ -432,24 +432,25 @@ public class DictionaryActivity extends ActionBarActivity { setListAdapter(new IndexAdapter(index)); + // Pre-load the Transliterator (will spawn its own thread) + TransliteratorManager.init(new TransliteratorManager.Callback() { + @Override + public void onTransliteratorReady() { + uiHandler.post(new Runnable() { + @Override + public void run() { + onSearchTextChange(searchView.getQuery().toString()); + } + }); + } + }, DictionaryApplication.threadBackground); + // Pre-load the collators. new Thread(new Runnable() { public void run() { - android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND); + android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_LESS_FAVORABLE); final long startMillis = System.currentTimeMillis(); try { - TransliteratorManager.init(new TransliteratorManager.Callback() { - @Override - public void onTransliteratorReady() { - uiHandler.post(new Runnable() { - @Override - public void run() { - onSearchTextChange(searchView.getQuery().toString()); - } - }); - } - }); - for (final Index index : dictionary.indices) { final String searchToken = index.sortedIndexEntries.get(0).token; final IndexEntry entry = index.findExact(searchToken); diff --git a/src/com/hughes/android/dictionary/DictionaryApplication.java b/src/com/hughes/android/dictionary/DictionaryApplication.java index 53e4175..ea0d0b1 100644 --- a/src/com/hughes/android/dictionary/DictionaryApplication.java +++ b/src/com/hughes/android/dictionary/DictionaryApplication.java @@ -72,6 +72,15 @@ public class DictionaryApplication extends Application { //static public final boolean USE_COLLATOR = !android.os.Build.FINGERPRINT.equals("Samsung/cm_tassve/tassve:4.4.4/KTU84Q/20150211:userdebug/release-keys"); static public final boolean USE_COLLATOR = true; + static public final TransliteratorManager.ThreadSetup threadBackground = new TransliteratorManager.ThreadSetup() { + @Override + public void onThreadStart() { + // THREAD_PRIORITY_BACKGROUND seemed like a good idea, but it + // can make Transliterator go from 20 seconds to 3 minutes (!) + android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_LESS_FAVORABLE); + } + }; + // Static, determined by resources (and locale). // Unordered. static Map DOWNLOADABLE_UNCOMPRESSED_FILENAME_NAME_TO_DICTIONARY_INFO = null; @@ -328,7 +337,7 @@ public class DictionaryApplication extends Application { public void onCreate() { super.onCreate(); Log.d("QuickDic", "Application: onCreate"); - TransliteratorManager.init(null); + TransliteratorManager.init(null, threadBackground); staticInit(getApplicationContext()); languageButtonPixels = (int) TypedValue.applyDimension( diff --git a/src/com/hughes/android/dictionary/engine/Index.java b/src/com/hughes/android/dictionary/engine/Index.java index e289f49..9ac805a 100644 --- a/src/com/hughes/android/dictionary/engine/Index.java +++ b/src/com/hughes/android/dictionary/engine/Index.java @@ -517,7 +517,7 @@ public final class Index implements RAFSerializable { } private String normalizeToken(final String searchToken) { - if (TransliteratorManager.init(null)) { + if (TransliteratorManager.init(null, null)) { final Transliterator normalizer = normalizer(); return normalizer.transliterate(searchToken); } else { diff --git a/src/com/hughes/android/dictionary/engine/TransliteratorManager.java b/src/com/hughes/android/dictionary/engine/TransliteratorManager.java index eacab80..9613d9f 100644 --- a/src/com/hughes/android/dictionary/engine/TransliteratorManager.java +++ b/src/com/hughes/android/dictionary/engine/TransliteratorManager.java @@ -25,6 +25,7 @@ public class TransliteratorManager { private static boolean starting = false; private static boolean ready = false; + private static ThreadSetup threadSetup = null; private static LRUCacheMap cache = new LRUCacheMap(4); // Whom to notify when we're all set up and ready to go. @@ -46,7 +47,7 @@ public class TransliteratorManager { return result; } - public static synchronized boolean init(final Callback callback) { + public static synchronized boolean init(final Callback callback, final ThreadSetup setupCallback) { if (ready) { return true; } @@ -55,6 +56,7 @@ public class TransliteratorManager { } if (!starting) { starting = true; + threadSetup = setupCallback; new Thread(init).start(); } return false; @@ -63,6 +65,9 @@ public class TransliteratorManager { private static final Runnable init = new Runnable() { @Override public void run() { + synchronized (TransliteratorManager.class) { + if (threadSetup != null) threadSetup.onThreadStart(); + } System.out.println("Starting Transliterator load."); final String transliterated = get(Language.en.getDefaultNormalizerRules()).transliterate("Îñţérñåţîöñåļîžåţîờñ"); if (!"internationalization".equals(transliterated)) { @@ -80,6 +85,10 @@ public class TransliteratorManager { } }; + public interface ThreadSetup { + void onThreadStart(); + } + public interface Callback { void onTransliteratorReady(); } -- 2.43.0