X-Git-Url: http://gitweb.fperrin.net/?a=blobdiff_plain;f=src%2Fcom%2Fhughes%2Fandroid%2Fdictionary%2Fengine%2FTransliteratorManager.java;h=4dfb2b67d9ccf85a114eb847b7e5b5171c16c48e;hb=8674b09eae371994e01e0af541b546fced86c366;hp=c3bfe8ae4832f6dd1823cddd99286c0f1eb4e2f0;hpb=6ff9a75f3fc9837a83e047125eea0bc0d94f7c90;p=Dictionary.git diff --git a/src/com/hughes/android/dictionary/engine/TransliteratorManager.java b/src/com/hughes/android/dictionary/engine/TransliteratorManager.java index c3bfe8a..4dfb2b6 100644 --- a/src/com/hughes/android/dictionary/engine/TransliteratorManager.java +++ b/src/com/hughes/android/dictionary/engine/TransliteratorManager.java @@ -14,20 +14,39 @@ package com.hughes.android.dictionary.engine; -import com.ibm.icu.text.Transliterator; - import java.util.ArrayList; import java.util.List; +import com.hughes.util.LRUCacheMap; +import com.ibm.icu.text.Transliterator; + public class TransliteratorManager { private static boolean starting = false; private static boolean ready = false; + private static ThreadSetup threadSetup = null; + private static final LRUCacheMap cache = new LRUCacheMap<>(4); // Whom to notify when we're all set up and ready to go. - private static List callbacks = new ArrayList(); + private static final List callbacks = new ArrayList<>(); + + public static Transliterator get(String rules) { + // DO NOT make the method synchronized! + // synchronizing on the class would break the whole + // asynchronous init concept, since the runnable + // then holds the same lock as the init function needs. + Transliterator result; + synchronized (cache) { + result = cache.get(rules); + if (result == null) { + result = Transliterator.createFromRules("", rules, Transliterator.FORWARD); + cache.put(rules, result); + } + } + 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; } @@ -36,6 +55,7 @@ public class TransliteratorManager { } if (!starting) { starting = true; + threadSetup = setupCallback; new Thread(init).start(); } return false; @@ -44,20 +64,18 @@ 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 = - Transliterator - .createFromRules( - "", - Language.en.getDefaultNormalizerRules(), - Transliterator.FORWARD).transliterate("Îñţérñåţîöñåļîžåţîờñ"); + final String transliterated = get(Language.en.getDefaultNormalizerRules()).transliterate("Îñţérñåţîöñåļîžåţîờñ"); if (!"internationalization".equals(transliterated)) { System.out.println("Wrong transliteration: " + transliterated); } - final List callbacks = new ArrayList(); + final List callbacks; synchronized (TransliteratorManager.class) { - callbacks.addAll(TransliteratorManager.callbacks); + callbacks = new ArrayList<>(TransliteratorManager.callbacks); ready = true; } for (final Callback callback : callbacks) { @@ -66,6 +84,10 @@ public class TransliteratorManager { } }; + public interface ThreadSetup { + void onThreadStart(); + } + public interface Callback { void onTransliteratorReady(); }