I have an asyncTask Class which is called whenever the user taps a "Send" button from an AppCompatActivity
. In the doInBackground
method of my AsyncTask, I translate a string into 30 languages using Google Translate API. The problem is, it takes some time for each string to be translated into each language. I feel like it would be a better approach to run all of these functions at the same time by multithreading.
Each time a try
and catch
is its own set of instructions to translate a string into 1 language. This approach is too slow.
Here is my doInBackground Function:
@Override
protected Void doInBackground(Void... voids) {
translate = TranslateOptions.newBuilder().setApiKey("GOOGLE_API_KEY").build().getService();
/*ENGLISH TO ARABIC*/
try {
Translation translation =
translate.translate(
MY_STRING,
Translate.TranslateOption.sourceLanguage("en"),
Translate.TranslateOption.targetLanguage("ar"));
parseObject.put("data0", translation.getTranslatedText());
} catch (Exception e) {
parseObject.put("data0", MY_STRING + " " + mContext.getString(R.string.translationfailed));
}
/*English to Chinese*/
try {
Translation
translation =
translate.translate(
MY_STRING,
Translate.TranslateOption.sourceLanguage("en"),
Translate.TranslateOption.targetLanguage("zh-CN"));
parseObject.put("data1", translation.getTranslatedText());
} catch (Exception e) {
parseObject.put("data1", MY_STRING + " " + mContext.getString(R.string.translationfailed));
}
/*28 More languages run...*/
/*Then, Save Data into server*/
parseObject.saveinBackground();
return null;
}
You need to use Multi Thread. AsyncTask is good for Short time & light operation. read this tutorial
download and test sample code.
also you can run one AsyncTask and Pass same parameters for each lanuage. but for multiple AsyncTask
class doSomethingInBack extends AsyncTask(String, String, String){}
this is Thread Sample class PhotoDecodeRunnable implements Runnable { /* * Defines the code to run for this task. */ @Override public void run() { // Moves the current Thread into the background android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND);
/*
* Stores the current Thread in the PhotoTask instance,
* that the instance
* can interrupt the Thread.
*/
try {
Translation translation =
translate.translate(
MY_STRING,
Translate.TranslateOption.sourceLanguage("en"),
Translate.TranslateOption.targetLanguage("ar"));
parseObject.put("data0", translation.getTranslatedText());
} catch (Exception e) {
parseObject.put("data0", MY_STRING + " " + mContext.getString(R.string.translationfailed));
}
/*English to Chinese*/
try {
Translation
translation =
translate.translate(
MY_STRING,
Translate.TranslateOption.sourceLanguage("en"),
Translate.TranslateOption.targetLanguage("zh-CN"));
parseObject.put("data1", translation.getTranslatedText());
} catch (Exception e) {
parseObject.put("data1", MY_STRING + " " + mContext.getString(R.string.translationfailed));
}
}
}