Android错误:必须从当前推断线程正在工作的ui线程调用方法gettext
大家好,我是Android新手,我正在构建一个从英语到德语的翻译应用程序,由于遵循以下代码行,我收到了上述错误: 请帮我解决这个问题Android错误:必须从当前推断线程正在工作的ui线程调用方法gettext,android,text-to-speech,microsoft-translator,Android,Text To Speech,Microsoft Translator,大家好,我是Android新手,我正在构建一个从英语到德语的翻译应用程序,由于遵循以下代码行,我收到了上述错误: 请帮我解决这个问题 package com.exmaple.android.lang_trans; import java.util.Locale; import android.app.Activity; import android.os.AsyncTask; import android.os.Bundle; import android.speech.tts.Tex
package com.exmaple.android.lang_trans;
import java.util.Locale;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import com.exmaple.android.lang_trans.R;
import com.memetix.mst.language.Language;
import com.memetix.mst.translate.Translate;
public class MainActivity extends Activity implements OnInitListener {
private TextToSpeech tts;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tts = new TextToSpeech(this, this);
((Button) findViewById(R.id.bSpeak)).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
speakOut(((TextView) findViewById(R.id.tvTranslatedText)).getText().toString());
}
});
((Button) findViewById(R.id.bTranslate)).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
class bgStuff extends AsyncTask<Void, Void, Void> {
String translatedText = "";
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
try {
//below line is throwing the error
String text = ((EditText) findViewById(R.id.etUserText)).getText().toString();
translatedText = translate(text);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
translatedText = e.toString();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
// TODO Auto-generated method stub
((TextView) findViewById(R.id.tvTranslatedText)).setText(translatedText);
super.onPostExecute(result);
}
}
new bgStuff().execute();
}
});
}
public String translate(String text) throws Exception {
// Set the Client ID / Client Secret once per JVM. It is set statically and applies to all services
Translate.setClientId("CLIENT ID"); //Change this
Translate.setClientSecret("CLIENT SECRET"); //change
String translatedText = "";
translatedText = Translate.execute(text, Language.GERMAN);
return translatedText;
}
@Override
public void onInit(int status) {
// TODO Auto-generated method stub
if (status == TextToSpeech.SUCCESS) {
int result = tts.setLanguage(Locale.GERMAN);
if (result == TextToSpeech.LANG_MISSING_DATA
|| result == TextToSpeech.LANG_NOT_SUPPORTED) {
Log.e("TTS", "This Language is not supported");
} else {
//speakOut("Ich");
}
} else {
Log.e("TTS", "Initilization Failed!");
}
}
private void speakOut(String text) {
tts.speak(text, TextToSpeech.QUEUE_FLUSH, null);
}
}
package com.exmaple.android.lang\u trans;
导入java.util.Locale;
导入android.app.Activity;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.speech.tts.TextToSpeech;
导入android.speech.tts.TextToSpeech.OnInitListener;
导入android.util.Log;
导入android.view.view;
导入android.view.view.OnClickListener;
导入android.widget.Button;
导入android.widget.EditText;
导入android.widget.TextView;
导入com.exmaple.android.lang_trans.R;
导入com.memetix.mst.language.language;
导入com.memetix.mst.translate.translate;
公共类MainActivity扩展活动实现OnInitListener{
私密文本语音tts;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tts=新的TextToSpeech(这个,这个);
((按钮)findViewById(R.id.bSpeak)).setOnClickListener(新OnClickListener(){
@凌驾
公共void onClick(视图v){
//TODO自动生成的方法存根
speakOut(((TextView)findViewById(R.id.tvTranslatedText)).getText().toString());
}
});
((按钮)findviewbyd(R.id.bTranslate)).setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
//TODO自动生成的方法存根
类bgStuff扩展异步任务{
字符串translatedText=“”;
@凌驾
受保护的Void doInBackground(Void…参数){
//TODO自动生成的方法存根
试一试{
//下面一行是抛出错误
字符串文本=((EditText)findViewById(R.id.etUserText)).getText().toString();
translatedText=翻译(文本);
}捕获(例外e){
//TODO自动生成的捕捉块
e、 printStackTrace();
translatedText=e.toString();
}
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
//TODO自动生成的方法存根
((TextView)findViewById(R.id.tvTranslatedText)).setText(translatedText);
super.onPostExecute(结果);
}
}
新建bgStuff().execute();
}
});
}
公共字符串翻译(字符串文本)引发异常{
//为每个JVM设置一次客户机ID/客户机机密。它是静态设置的,并应用于所有服务
Translate.setClientId(“客户端ID”);//更改此设置
Translate.setClientSecret(“客户端密码”);//更改
字符串translatedText=“”;
translatedText=Translate.execute(文本、语言、德语);
返回翻译文本;
}
@凌驾
公共无效onInit(int状态){
//TODO自动生成的方法存根
if(status==TextToSpeech.SUCCESS){
int result=tts.setLanguage(Locale.derman);
if(result==TextToSpeech.LANG_缺少_数据
||结果==TextToSpeech.LANG(不支持){
Log.e(“TTS”,“不支持这种语言”);
}否则{
//说出(“Ich”);
}
}否则{
Log.e(“TTS”,“初始化失败!”);
}
}
专用void扬声器(字符串文本){
tts.speak(text,TextToSpeech.QUEUE\u FLUSH,null);
}
}
您的问题是,您正在访问的UI元素不是android系统不允许的UI线程
您不能从UI线程或“主”线程以外的任何线程更新UI
因此,您可以将onClick函数更改为以下内容:
((Button) findViewById(R.id.bTranslate)).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
class bgStuff extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
try {
if (params.length > 0) {
return translate(params[0]);
}
} catch (Exception e) {
e.printStackTrace();
return e.toString();
}
return null;
}
@Override
protected void onPostExecute(String result) {
((TextView) findViewById(R.id.tvTranslatedText)).setText(result);
}
}
new bgStuff().execute(((EditText) findViewById(R.id.etUserText)).getText().toString());
}
});
((按钮)findViewById(R.id.bTranslate)).setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
类bgStuff扩展异步任务{
@凌驾
受保护的字符串doInBackground(字符串…参数){
//TODO自动生成的方法存根
试一试{
如果(参数长度>0){
返回translate(参数[0]);
}
}捕获(例外e){
e、 printStackTrace();
返回e.toString();
}
返回null;
}
@凌驾
受保护的void onPostExecute(字符串结果){
((TextView)findViewById(R.id.tvTranslatedText)).setText(结果);
}
}
新建bgStuff().execute(((EditText)findViewById(R.id.etUserText)).getText().toString());
}
});
如果你的问题已经解决了你的问题,请考虑通过点击复选标记来接受它。这向更广泛的社区表明,你已经找到了一个解决方案,并给回答者和你自己带来了一些声誉。没有义务这样做。