X-Git-Url: http://gitweb.fperrin.net/?a=blobdiff_plain;f=src%2Fcom%2Fhughes%2Fandroid%2Fdictionary%2Fengine%2FTransliteratorManager.java;h=eacab80daac3bd9a5189bbb6433b6dd7c2f99923;hb=24e9e80d611f03d4bc75871bf6cff5fe227b4ee3;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..eacab80 100644 --- a/src/com/hughes/android/dictionary/engine/TransliteratorManager.java +++ b/src/com/hughes/android/dictionary/engine/TransliteratorManager.java @@ -19,14 +19,33 @@ import com.ibm.icu.text.Transliterator; import java.util.ArrayList; import java.util.List; +import com.hughes.util.LRUCacheMap; + public class TransliteratorManager { private static boolean starting = false; private static boolean ready = false; + private static LRUCacheMap cache = new LRUCacheMap(4); // Whom to notify when we're all set up and ready to go. private static 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 = null; + 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) { if (ready) { return true; @@ -45,12 +64,7 @@ public class TransliteratorManager { @Override public void run() { 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); }