首页 文章

无法在未调用Looper.prepare()的线程内创建处理程序 - Google Translate [duplicate]

提问于
浏览
1

这个问题在这里已有答案:

您好我正在尝试使用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 回答

  • 0

    您不需要创建新的Handler . 您可以将任何视图用作处理程序 .

    txtSource.post(new Runnable() {
        public void run(){
            txtSource.setText(...
        }
    });
    

    如果你真的想创建一个处理程序,那么如错误消息中所述,在 doInBackground 的第一行和最后一行的 Looper.loop() 中调用 Looper.prepare(); .

    doInBackground(){
        Looper.prepare();
        //your code
        Lopper.loop();
    }
    

    如果您的代码在活动中或具有活动引用,则可以使用方法 runOnUiThread 直接在UI线程中执行操作 .

  • 0

    不确定它是哪一行,但是从 Exception 看,它看起来像 doInBackground() 方法中的一个方法是试图显示 Toast . 试图从后台线程显示 View 是一个禁忌,这是造成崩溃的原因 .

    您可以将块包装在 try { } catch(Exception e) { ... } 中以识别试图显示 Toast 的行 - 因为该块可能应该从后台线程中拉出以防止 Exception .

相关问题