2017-10-10 9 views
1

안녕하세요, 버튼으로 번역을 클릭하면 Google translate API를 사용하여 문자열을 변환하려고합니다. AVD로 실행할 때 문제가되는 것은 스마트 폰으로 배포하려고 할 때입니다. 번역 버튼을 클릭하여 앱 클로스를 클릭하면 오류가 발생합니다.Looper.prepare()를 호출하지 않은 스레드에서 핸들러를 생성 할 수 없습니다 - Google 번역

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()의 첫 번째 줄에 Looper.prepare();를 호출합니다.

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

코드가 활동 안에 또는 활동의 참조가있는 경우, 당신이 직접이 특히입니다 라인 runOnUiThread

0

확실하지 방법을 사용하여 UI 스레드에 거즈를 할 수 있지만에서 Exception, doInBackground() 메소드 내부에있는 메소드 중 하나가 Toast을 표시하려고합니다. 배경 스레드에서 View을 표시하려고하면 오류가 발생합니다.

Toast을 표시하려고하는 라인을 식별하기 위해 try { } catch(Exception e) { ... }에있는 블록을 래핑 할 수 있습니다.이 부분은 Exception을 방지하기 위해 백그라운드 스레드에서 빠져 나와야합니다.

+0

더 이상 디버깅 할 필요가 없습니다. 이것은 다른 스레드에서 UI 작업을 시도하는 고전적인 결과입니다. –

+0

나는 토스트를 사용하여 코드가 어디에 있는지 확인했다. 다시 정리하고 배포하는 것을 잊지 만 토스트로이 선이 실행될 때까지 "새 AsyncTask () {"및 중지 – brunocdias