summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkr.angelov <kr.angelov@gmail.com>2013-10-07 11:26:53 +0000
committerkr.angelov <kr.angelov@gmail.com>2013-10-07 11:26:53 +0000
commit5041984e2df1b480bbf81eb135874be95d51838b (patch)
treeb6a31860f4aee105260edcf72e6219d5bdb7b03b
parentd32769760509c560fb47ca0045ecf783cf09a8b5 (diff)
ensure that the grammar is loaded only once
-rw-r--r--src/ui/android/src/org/grammaticalframework/ui/android/Translator.java92
1 files changed, 47 insertions, 45 deletions
diff --git a/src/ui/android/src/org/grammaticalframework/ui/android/Translator.java b/src/ui/android/src/org/grammaticalframework/ui/android/Translator.java
index a1851fd50..1d6e081e8 100644
--- a/src/ui/android/src/org/grammaticalframework/ui/android/Translator.java
+++ b/src/ui/android/src/org/grammaticalframework/ui/android/Translator.java
@@ -29,20 +29,17 @@ public class Translator {
new Language("fr-FR", "French", "ResourceDemoFre"),
};
- private final Context mContext;
-
private Language mSourceLanguage;
private Language mTargetLanguage;
- private PGF mPgf;
+ private PGF mPGF;
+ private Thread mGrammarLoader;
- public Translator(Context context) {
- mContext = context;
- }
- public Context getContext() {
- return mContext;
+ public Translator(Context context) {
+ mGrammarLoader = new GrammarLoader(context);
+ mGrammarLoader.start();
}
public List<Language> getAvailableSourceLanguages() {
@@ -72,43 +69,7 @@ public class Translator {
/**
* Takes a lot of time. Must not be called on the main thread.
*/
- public void init() {
- ensureLoaded(mGrammar);
- }
-
- /**
- * Takes a lot of time. Must not be called on the main thread.
- */
public String translate(String input) {
- ensureLoaded(mGrammar);
- return translateInternal(input);
- }
-
- private synchronized void ensureLoaded(String grammarName) {
- if (mPgf != null) return;
-
- InputStream in = null;
-
- try {
- // TODO: use PGF API to read this directly from assets
- in = getContext().getAssets().open(grammarName);
- Log.d(TAG, "Trying to open " + grammarName);
- mPgf = PGF.readPGF(in);
- } catch (FileNotFoundException e) {
- Log.e(TAG, "File not found", e);
- } catch (IOException e) {
- Log.e(TAG, "Error loading grammar", e);
- } finally {
- if (in != null) {
- try {
- in.close();
- } catch (IOException e) {
- }
- }
- }
- }
-
- protected String translateInternal(String input) {
try {
Concr sourceGrammar = getConcr(getSourceLanguage().getConcrete());
Expr expr = sourceGrammar.parseBest("S", input);
@@ -122,7 +83,48 @@ public class Translator {
}
private Concr getConcr(String name) {
- return mPgf.getLanguages().get(name);
+ return getGrammar().getLanguages().get(name);
}
+ private PGF getGrammar() {
+ try {
+ mGrammarLoader.join();
+ } catch (InterruptedException e) {
+ Log.e(TAG, "Loading interrupted", e);
+ }
+ return mPGF;
+ }
+
+ private class GrammarLoader extends Thread {
+ private final Context mContext;
+
+ public GrammarLoader(Context context) {
+ mContext = context;
+ }
+
+ public void run() {
+ InputStream in = null;
+
+ try {
+ in = mContext.getAssets().open(mGrammar);
+ Log.d(TAG, "Trying to open " + mGrammar);
+ long t1 = System.currentTimeMillis();
+ mPGF = PGF.readPGF(in);
+ long t2 = System.currentTimeMillis();
+ Log.d(TAG, "Grammar loaded ("+(t2-t1)+" ms)");
+ } catch (FileNotFoundException e) {
+ Log.e(TAG, "File not found", e);
+ } catch (IOException e) {
+ Log.e(TAG, "Error loading grammar", e);
+ } finally {
+ if (in != null) {
+ try {
+ in.close();
+ } catch (IOException e) {
+ Log.e(TAG, "Error closing the stream", e);
+ }
+ }
+ }
+ }
+ }
}