【问题标题】:How to execute multiple functions at the same time in an AsyncTask?如何在 AsyncTask 中同时执行多个函数?
【发布时间】:2017-03-01 04:07:42
【问题描述】:

我有一个 asyncTask 类,只要用户从AppCompatActivity 中点击“发送”按钮,就会调用它。在我的 AsyncTask 的 doInBackground 方法中,我使用 Google Translate API 将字符串翻译成 30 种语言。问题是,将每个字符串翻译成每种语言需要一些时间。我觉得通过多线程同时运行所有这些功能会是一种更好的方法。

每次trycatch 都是它自己的一组指令,用于将字符串翻译成一种语言。这种方法太慢了。

这是我的 doInBackground 函数:

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

【问题讨论】:

标签: java android multithreading android-asynctask google-translate


【解决方案1】:

您需要使用多线程。 AsyncTask 适用于短时间和轻量级操作。 read this tutorial

下载并测试示例代码。

您也可以运行一个 AsyncTask 并为每个语言传递相同的参数。 但是对于多个 AsyncTask

class doSomethingInBack extends AsyncTask(String, String, String){}

See this Question

这是线程示例 类 PhotoDecodeRunnable 实现 Runnable { /* * 定义为此任务运行的代码。 */ @覆盖 公共无效运行(){ // 将当前线程移动到后台 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));
}

}
}

【讨论】:

  • 此链接对我来说已损坏。
  • 这正是我想要的。如果您针对我的情况提供示例代码,我将标记为已接受的答案。
  • 复制并粘贴你所有的 try{}catch(){} 函数来线程化它超级简单@grant
  • 请举个例子。
【解决方案2】:

检查这个答案:

ParserTask parserTask = new ParserTask();
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){
        parserTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, result);
    }else{
        parserTask.execute(result);
    }

【讨论】:

  • 这是做什么的?我应该把函数放在哪里?
  • 允许您同时运行多个任务/在您调用方法 asyncTask.execute 时放置代码。在我的例子中 parserTask 是 Class extends AsyncTask 的实例
猜你喜欢
  • 1970-01-01
  • 2017-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-29
  • 1970-01-01
  • 2015-12-14
  • 1970-01-01
相关资源
最近更新 更多