Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android Studio错误:";方法getText必须从UI线程调用,当前推断的线程为工作线程_Java_Android_Gettext - Fatal编程技术网

Java Android Studio错误:";方法getText必须从UI线程调用,当前推断的线程为工作线程

Java Android Studio错误:";方法getText必须从UI线程调用,当前推断的线程为工作线程,java,android,gettext,Java,Android,Gettext,我对gettext()有一个问题,Android studio说“必须从UI线程调用方法gettext,当前推断的线程是worker”。有人能帮我解决这个问题吗?或者有人能给我一个解决这个问题的方法吗? 谢谢 package com.ibm.watsonvoicetts; 导入android.os.AsyncTask; 导入android.support.v7.app.AppActivity; 导入android.os.Bundle; 导入android.view.view; 导入android

我对gettext()有一个问题,Android studio说“必须从UI线程调用方法gettext,当前推断的线程是worker”。有人能帮我解决这个问题吗?或者有人能给我一个解决这个问题的方法吗? 谢谢

package com.ibm.watsonvoicetts;
导入android.os.AsyncTask;
导入android.support.v7.app.AppActivity;
导入android.os.Bundle;
导入android.view.view;
导入android.widget.Button;
导入android.widget.EditText;
导入android.widget.TextView;
导入com.ibm.watson.developer\u cloud.android.library.audio.StreamPlayer;
将com.ibm.watson.developer_cloud.text_导入到_speech.v1.TextToSpeech;
将com.ibm.watson.developer_cloud.text_导入到_speech.v1.model.Voice;
公共类MainActivity扩展了AppCompatActivity{
文本视图文本视图;
编辑文本编辑文本;
按钮;
StreamPlayer StreamPlayer;
私有TextToSpeech initTextToSpeechService(){
TextToSpeech服务=新建TextToSpeech();
字符串username=“”;
字符串密码=”;
service.setUserName和password(用户名、密码);
回程服务;
}
私有类WatsonTask扩展了AsyncTask{
@凌驾
受保护的字符串背景(字符串…textToSpeak){
runOnUiThread(新的Runnable(){
@凌驾
公开募捐{
setText(“运行Watson线程”);
}
});
TextToSpeech TextToSpeech=initTextToSpeechService();
streamPlayer=新的streamPlayer();
streamPlayer.playStream(textToSpeech.synthesis(
String.valueOf(editText.getText()),[**问题出在这里**
Voice.EN_MICHAEL).execute();
返回“文本到语音完成”;
}
@凌驾
受保护的void onPostExecute(字符串结果){
setText(“TTS状态:+结果”);
}
}
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText=(editText)findViewById(R.id.editText);
按钮=(按钮)findViewById(R.id.button);
textView=(textView)findViewById(R.id.textView);
setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
System.out.println(“文本到语音:+editText.getText());
textView.setText(“TTS:+editText.getText());
WatsonTask任务=新建WatsonTask();
执行(新字符串[]{});
}
});
}

}

您不应该像现在这样从
AsyncTask
调用
getText
。解决方案是将值传递到任务的构造函数中

改变

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

doInBackground()方法在不同的线程上运行,而不是在UI线程中

streamPlayer.playStream(textToSpeech.synthesize(
                String.valueOf(editText.getText()),【**here is the problem**】
                Voice.EN_MICHAEL).execute());
在这个doInBackground()方法中,您正在调用edittext的getText()方法。这就是它给出错误的原因。任何与视图相关的工作,我们都必须在UI线程中完成

有一件事你可以做到,你可以把这段代码放在runOnUiThread中。

看看这个
private class WatsonTask extends AsyncTask<String, Void, String> {
    private final String text;
    public WatsonTask(String text) {
        super();
        this.text = text;
    }
streamPlayer.playStream(textToSpeech.synthesize(
            String.valueOf(text),
            Voice.EN_MICHAEL).execute());
streamPlayer.playStream(textToSpeech.synthesize(
                String.valueOf(editText.getText()),【**here is the problem**】
                Voice.EN_MICHAEL).execute());