Search code examples
javaandroidmultithreadingandroid-asynctaskgoogle-translate

How to execute multiple functions at the same time in an AsyncTask?


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;
}

Solution

  • 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){}
    

    See this Question

    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));
    }
    
    }
    }