package com.hughes.android.dictionary.engine;
-import android.support.v4.util.LruCache;
-
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 LruCache<String, Transliterator> cache = new LruCache<String, Transliterator>(4);
+ private static ThreadSetup threadSetup = null;
+ private static LRUCacheMap<String, Transliterator> cache = new LRUCacheMap<String, Transliterator>(4);
// Whom to notify when we're all set up and ready to go.
private static List<Callback> callbacks = new ArrayList<TransliteratorManager.Callback>();
- public static synchronized Transliterator get(String rules) {
- Transliterator result = cache.get(rules);
- if (result == null) {
- result = Transliterator.createFromRules("", rules, Transliterator.FORWARD);
- cache.put(rules, result);
+ 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) {
+ public static synchronized boolean init(final Callback callback, final ThreadSetup setupCallback) {
if (ready) {
return true;
}
}
if (!starting) {
starting = true;
+ threadSetup = setupCallback;
new Thread(init).start();
}
return false;
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)) {
}
};
+ public interface ThreadSetup {
+ void onThreadStart();
+ }
+
public interface Callback {
void onTransliteratorReady();
}