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 LRUCacheMap<String, Transliterator> cache = new LRUCacheMap<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 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;
+ Transliterator result;
synchronized (cache) {
result = cache.get(rules);
if (result == null) {
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();
}