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;
+import com.ibm.icu.text.Transliterator;
+
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 final LRUCacheMap<String, Transliterator> cache = new LRUCacheMap<>(4);
// Whom to notify when we're all set up and ready to go.
- private static List<Callback> callbacks = new ArrayList<TransliteratorManager.Callback>();
+ private static final List<Callback> callbacks = new ArrayList<>();
- 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;
+ 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)) {
System.out.println("Wrong transliteration: " + transliterated);
}
- final List<Callback> callbacks = new ArrayList<TransliteratorManager.Callback>();
+ final List<Callback> callbacks;
synchronized (TransliteratorManager.class) {
- callbacks.addAll(TransliteratorManager.callbacks);
+ callbacks = new ArrayList<>(TransliteratorManager.callbacks);
ready = true;
}
for (final Callback callback : callbacks) {
}
};
+ public interface ThreadSetup {
+ void onThreadStart();
+ }
+
public interface Callback {
void onTransliteratorReady();
}