2017-10-10 8 views
1

こんにちは私はボタンで翻訳をクリックするとgoogle translate apiを使用して文字列を翻訳しようとしています。私はAVDとして動作しても正常に動作しますが、問題はスマートフォンで展開しようとするときです。翻訳ボタンをクリックするとアプリケーションのクローズが発生し、エラーが発生します。Looper.prepare()を呼び出していないスレッド内でハンドラを作成できません - Google Translate

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

エラー:

Process: com.google.sample.cloudvision, PID: 8874 java.lang.RuntimeException: An error occurred while executing doInBackground() at android.os.AsyncTask$3.done(AsyncTask.java:309) at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) at java.util.concurrent.FutureTask.setException(FutureTask.java:223) at java.util.concurrent.FutureTask.run(FutureTask.java:242) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) at java.lang.Thread.run(Thread.java:818) Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() at android.os.Handler.(Handler.java:200) at android.os.Handler.(Handler.java:114) at android.widget.Toast$TN.(Toast.java:345) at android.widget.Toast.(Toast.java:101) at android.widget.Toast.makeText(Toast.java:259) at com.google.sample.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) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) at java.lang.Thread.run(Thread.java:818)

答えて

0

あなたは新しいハンドラを作成する必要はありません。任意のビューをハンドラとして使用できます。エラーメッセージで述べたように

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

あなたが本当にハンドラを作成したい場合は

、そして、最後の行の doInBackgroundLooper.loop()の1行目に Looper.prepare();を呼び出します。

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

あなたのコードは活動の内部にあるか、アクティビティの参照を持っている場合は、あなたが直接、それは特にされている行runOnUiThread

0

わからない方法を使用してUIスレッドで詰め込むを行うことができますが、からExceptiondoInBackground()メソッド内のメソッドの1つがToastを表示しようとしているようです。バックグラウンドスレッドからViewを表示しようとすると、いいえいいえ、クラッシュの原因になります。

あなたがToastを表示しようとしている行を識別するためにtry { } catch(Exception e) { ... }でブロックをラップすることができ - その部分はおそらくExceptionを防ぐために、バックグラウンドスレッドから引き出さなければならないので。

+0

これをさらにデバッグする必要はありません。これは、別のスレッドでUI操作を実行しようとする古典的な結果です。 –

+0

私はToastを使って自分のコードがどこに行くかチェックしましたが、もう一度きれいにしてデプロイするのを忘れましたが、トーストで私はこの行まで実行することをckeckedしました "新しいAsyncTask (){" – brunocdias

関連する問題