2017-06-08 1 views
0

Ich habe ein Problem über gettext(), Android Studio sagt, dass 'Methode GetText von der UI-Thread aufgerufen werden muss, derzeit abgeleiteten Thread ist Arbeitnehmer. jemand mir dabei helfen kann, oder jemand eine Idee, wie das? Dank fix!Android Studio Fehler: "Methode GetText muss von der UI Thread aufgerufen werden, derzeit abgeleiteten Thread ist Worker

package com.ibm.watsonvoicetts; 

import android.os.AsyncTask; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 

import com.ibm.watson.developer_cloud.android.library.audio.StreamPlayer; 
import com.ibm.watson.developer_cloud.text_to_speech.v1.TextToSpeech; 
import com.ibm.watson.developer_cloud.text_to_speech.v1.model.Voice; 

public class MainActivity extends AppCompatActivity { 

TextView textView; 
EditText editText; 
Button button; 

StreamPlayer streamPlayer; 


private TextToSpeech initTextToSpeechService(){ 
    TextToSpeech service = new TextToSpeech(); 
    String username = ""; 
    String password = ""; 
    service.setUsernameAndPassword(username, password); 
    return service; 
} 

private class WatsonTask extends AsyncTask<String, Void, String> { 
    @Override 
    protected String doInBackground(String... textToSpeak) { 
     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       textView.setText("running the Watson thread"); 
      } 
     }); 

     TextToSpeech textToSpeech = initTextToSpeechService(); 
     streamPlayer = new StreamPlayer(); 
     streamPlayer.playStream(textToSpeech.synthesize(
       String.valueOf(editText.getText()),【**here is the problem**】 
       Voice.EN_MICHAEL).execute()); 

     return "text to speech done"; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     textView.setText("TTS status: " + result); 
    } 

} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    editText = (EditText) findViewById(R.id.editText); 
    button = (Button) findViewById(R.id.button); 
    textView = (TextView) findViewById(R.id.textView); 

    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      System.out.println("the text to speech: " + editText.getText()); 
      textView.setText("TTS: " + editText.getText()); 

      WatsonTask task = new WatsonTask(); 
      task.execute(new String[]{}); 


     } 
    }); 
} 

}

+0

Werfen Sie einen Blick auf diese [Frage] (https://stackoverflow.com/questions/32011996/method-gettext-must-be-called-from-the-ui-thread-android-studio) –

Antwort

0

Sie nicht nennen sollten getText von einem AsyncTask wie Sie tun geben kann Die Lösung besteht darin, den Wert in den Konstruktor der Aufgabe zu übertra- gen.

ändern

WatsonTask task = new WatsonTask(editText.getText()); 

und

private class WatsonTask extends AsyncTask<String, Void, String> { 
    private final String text; 
    public WatsonTask(String text) { 
     super(); 
     this.text = text; 
    } 

und

streamPlayer.playStream(textToSpeech.synthesize(
      String.valueOf(text), 
      Voice.EN_MICHAEL).execute()); 
0

doInBackground() Methode läuft auf anderen Thread nicht in UI-Thread.

streamPlayer.playStream(textToSpeech.synthesize(
       String.valueOf(editText.getText()),【**here is the problem**】 
       Voice.EN_MICHAEL).execute()); 

Sie rufen Methode getText() -Methode von EditText in diesem doInBackground(). Deshalb gibt es Fehler. Jede Arbeit von View-verwandten Dingen, wir müssen es in UI-Thread tun.

Eine Sache, die Sie tun können, können Sie diesen Code in RunOnUiThread platzieren.

Verwandte Themen