Java Android Studio错误:必须从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

我正在开发一个显示歌曲歌词的应用程序。我得到一个错误:必须从UI线程调用方法getText()。我一直在寻找答案,但没有任何答案能帮助解决问题

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构造函数。