Java Android Studio错误:必须从UI线程调用方法getText()
我正在开发一个显示歌曲歌词的应用程序。我得到一个错误:必须从UI线程调用方法getText()。我一直在寻找答案,但没有任何答案能帮助解决问题Java Android Studio错误:必须从UI线程调用方法getText(),java,android,multithreading,Java,Android,Multithreading,我正在开发一个显示歌曲歌词的应用程序。我得到一个错误:必须从UI线程调用方法getText()。我一直在寻找答案,但没有任何答案能帮助解决问题 public class HomeActivity extends AppCompatActivity { private EditText wykonawca; private EditText tytul; private Button pokazTekst; private TextView tekst; //String url = "htt
public class HomeActivity extends AppCompatActivity {
private EditText wykonawca;
private EditText tytul;
private Button pokazTekst;
private TextView tekst;
//String url = "http://www.tekstowo.pl/piosenka,";
String title;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
FindViews();
tekst.setMovementMethod(new ScrollingMovementMethod()); // mozliwosc scrolowania tekstu
pokazTekst.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new SongText().execute();
}
});
}
public class SongText extends AsyncTask<Void, Void, Void>{
String url = "http://www.tekstowo.pl/piosenka,";
String author;
String song_name;
@Override
protected Void doInBackground(Void... params) {
try {
// here is error
author = wykonawca.getText().toString();
song_name = tytul.getText().toString();
url = url + author + "," + song_name + ".html";
Document doc = Jsoup.connect(url).get();
title = doc.select("div[class=song-text").text();
}
catch (IOException e){
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
tekst.setText(title);
}
}
private void FindViews(){
// Edit text
wykonawca = (EditText) findViewById(R.id.wykonawca);
tytul = (EditText) findViewById(R.id.tytul);
// Buttons
pokazTekst = (Button) findViewById(R.id.pokazTekst);
// TextViews
tekst = (TextView) findViewById(R.id.tekst);
}
公共类HomeActivity扩展了AppCompatActivity{
私人编辑文本wykonawca;
私人编辑文本;
私人按钮pokazTekst;
私人TextView-tekst;
//字符串url=”http://www.tekstowo.pl/piosenka,";
字符串标题;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
FindView();
setMovementMethod(新的ScrollingMovementMethod());//mozliwosc scrolowania tekstu
setOnClickListener(新视图.OnClickListener()){
@凌驾
公共void onClick(视图v){
新建SongText().execute();
}
});
}
公共类SongText扩展异步任务{
字符串url=”http://www.tekstowo.pl/piosenka,";
字符串作者;
串歌名;
@凌驾
受保护的Void doInBackground(Void…参数){
试一试{
//这是一个错误
author=wykonawca.getText().toString();
song_name=tytul.getText().toString();
url=url+author+,“+song_name+”.html”;
Document doc=Jsoup.connect(url.get();
title=doc.select(“div[class=song text”).text();
}
捕获(IOE异常){
e、 printStackTrace();
}
返回null;
}
@凌驾
受保护的void onPostExecute(void避免){
super.onPostExecute(避免);
tekst.setText(标题);
}
}
私有void FindViews(){
//编辑文本
wykonawca=(EditText)findViewById(R.id.wykonawca);
tytul=(EditText)findViewById(R.id.tytul);
//钮扣
pokazTekst=(按钮)findViewById(R.id.pokazTekst);
//文本视图
tekst=(TextView)findViewById(R.id.tekst);
}
}您不能与UI线程外的UI元素交互。doInBackground()在后台运行,您不能与该线程中的textview交互。您正在从后台线程访问UI线程,此处:
author = wykonawca.getText().toString();
song_name = tytul.getText().toString();
检查这个,这样回答-
您正在从异步线程调用getText()。应该从UI线程调用它。您可以做的是在调用asynctask之前从textfields中获取值,并从字符串变量中读取值,或者将它们传递给asynctask构造函数。