这个问题在这里已有答案:
您好我正在尝试使用google translate api翻译字符串,当我单击按钮中的翻译时 . 当我作为AVD运行它运行正常,问题是当我尝试使用我的智能手机进行部署时,当我单击翻译按钮时,应用程序关闭并且我收到错误 .
Bundle bundle = getIntent().getExtras();
String word = "";
if(bundle.containsKey("Name")){
word = (String) bundle.getString("Name");
txtTarget.setText(word);
//envia para o translate api para traduzir a palavra pro portugues
}
final String finalWord = word;
btnResultado.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
final Handler textViewHandler = new Handler();
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
Translate translate = TranslateOptions.newBuilder().setApiKey(API_KEY).build().getService();
final Translation translation = translate.translate(finalWord, Translate.TranslateOption.targetLanguage("pt"));
textViewHandler.post(new Runnable() {
@Override
public void run() {
txtSource.setText(translation.getTranslatedText());
}
});
return null;
}
}.execute();
}
});
错误:
进程:com.google.sample.cloudvision,PID:8874 java.lang.RuntimeException:在java.util.concurrent的android.os.AsyncTask $ 3.done(AsyncTask.java:309)上执行doInBackground()时发生错误.FutureTask.finishCompletion(FutureTask.java:354)位于android.os的java.util.concurrent.FutureTask.run(FutureTask.java:242)的java.util.concurrent.FutureTask.setException(FutureTask.java:223) . java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)中的AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:234)at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:588)at at java.lang.Thread.run(Thread.java:818)引起:java.lang.RuntimeException:无法在android.os.Handler中未调用Looper.prepare()的线程内创建处理程序 . (Handler.java :200)在Android.os.Handler . (Handler.java:114)android.widget.Toast $ TN . (Toast.java:345)在android.widget.Toast . (Toast.java:101)在android . com.google.sam上的widget.Toast.makeText(Toast.java:259) ple.cloudvision.ActSegundaTela $ 1 $ 1 $ 1.doInBackground(ActSegundaTela.java:82)at com.google.sample.cloudvision.ActSegundaTela $ 1 $ 1 $ 1.doInBackground(ActSegundaTela.java:79)at android.os.AsyncTask $ 2.call(AsyncTask) .java:295)在java.util.concurrent.ThreadPoolExecutor.runWorker的android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:234)的java.util.concurrent.FutureTask.run(FutureTask.java:237) (ThreadPoolExecutor.java:1113)java.lang上的java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:588)(Thread.java:818)
2 回答
您不需要创建新的Handler . 您可以将任何视图用作处理程序 .
如果你真的想创建一个处理程序,那么如错误消息中所述,在
doInBackground
的第一行和最后一行的Looper.loop()
中调用Looper.prepare();
.如果您的代码在活动中或具有活动引用,则可以使用方法
runOnUiThread
直接在UI线程中执行操作 .不确定它是哪一行,但是从
Exception
看,它看起来像doInBackground()
方法中的一个方法是试图显示Toast
. 试图从后台线程显示View
是一个禁忌,这是造成崩溃的原因 .您可以将块包装在
try { } catch(Exception e) { ... }
中以识别试图显示Toast
的行 - 因为该块可能应该从后台线程中拉出以防止Exception
.