如何在一个 AsyncTask 中同时执行多个函数?
How to execute multiple functions at the same time in an AsyncTask?
我有一个 asyncTask Class,只要用户从 AppCompatActivity
中点击 "Send" 按钮,它就会被调用。在我的 AsyncTask 的 doInBackground
方法中,我使用 Google Translate API 将一个字符串翻译成 30 种语言。问题是,将每个字符串翻译成每种语言需要一些时间。我觉得通过多线程同时处理 运行 所有这些功能会是一种更好的方法。
每次 try
和 catch
都是它自己的一组指令,用于将字符串翻译成一种语言。这种方法太慢了。
这是我的 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;
}
您需要使用多线程。 AsyncTask 适用于短时间和轻型操作。
read this tutorial
下载并测试示例代码。
您也可以 运行 一个 AsyncTask 并为每种语言传递相同的参数。
但是对于多个 AsyncTask
class doSomethingInBack extends AsyncTask(String, String, String){}
See this Question
这是线程示例
class PhotoDecodeRunnable 实现 Runnable {
/*
* 将此任务的代码定义为 运行。
*/
@覆盖
public无效运行(){
// 将当前线程移到后台
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));
}
}
}
检查这个答案:
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 Class,只要用户从 AppCompatActivity
中点击 "Send" 按钮,它就会被调用。在我的 AsyncTask 的 doInBackground
方法中,我使用 Google Translate API 将一个字符串翻译成 30 种语言。问题是,将每个字符串翻译成每种语言需要一些时间。我觉得通过多线程同时处理 运行 所有这些功能会是一种更好的方法。
每次 try
和 catch
都是它自己的一组指令,用于将字符串翻译成一种语言。这种方法太慢了。
这是我的 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;
}
您需要使用多线程。 AsyncTask 适用于短时间和轻型操作。 read this tutorial
下载并测试示例代码。
您也可以 运行 一个 AsyncTask 并为每种语言传递相同的参数。 但是对于多个 AsyncTask
class doSomethingInBack extends AsyncTask(String, String, String){}
See this Question
这是线程示例 class PhotoDecodeRunnable 实现 Runnable { /* * 将此任务的代码定义为 运行。 */ @覆盖 public无效运行(){ // 将当前线程移到后台 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));
}
}
}
检查这个答案:
ParserTask parserTask = new ParserTask();
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){
parserTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, result);
}else{
parserTask.execute(result);
}