有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java无法从异步类在TextView中设置文本

在我的CountryInfoActivity.java中,我有一个Async Class从这个网站检索一个JSONhttps://pt.wikipedia.org/w/api.php?format=json&action=query&prop=extracts&exintro=&explaintext=&titles=Portugal。 然后,它将extract节点解析为一个字符串,以便我可以在文本视图中设置它。 问题是,每当我在文本视图中设置文本时,我的应用程序就会崩溃。JSON解析是正确的,因为它正在检索我想要的所有信息

这些是我用来检索数据的类,在最后一个类中,我试图将数据textoSobrePais设置到我的文本视图中。。。顺便说一句,在我的onCreate方法中我这样调用这个类new DownloadTask().execute(url);

public class DownloadTask extends AsyncTask<String,Integer,Void>{
@Override
protected Void doInBackground(String... params) {
    String url = params[0];
    getJSONFromURL(url);
    return null;
}
}



public String getJSONFromURL(String url){
    String json_string = null;
    try{
        URL obj = new URL(url);
        HttpURLConnection http = (HttpURLConnection) obj.openConnection();
        http.setRequestMethod("GET");
        int response = http.getResponseCode();
        Log.i("response",Integer.toString(response));
        BufferedReader reader  = new BufferedReader(new InputStreamReader(http.getInputStream()));
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine())!= null){
            sb.append(line+"\n");
        }
        reader.close();

        json_string = sb.toString();
        Log.i("json_string",json_string);
    } catch (UnsupportedEncodingException e){
        e.printStackTrace();
    } catch (ClientProtocolException e){
        e.printStackTrace();
    } catch (IOException e){
        e.printStackTrace();
    }
    ParseJson(json_string);
    return null;


}


public void ParseJson (String json){

JSONObject obj = null;
try {
    obj = new JSONObject(json);
} catch (JSONException e) {
    e.printStackTrace();
}
try {
    JSONArray pageIdObj = obj.getJSONObject("query").getJSONObject("pages").names();
    String page =  String.valueOf(pageIdObj.get(0));
    Log.i("ASdasd",page);
    textoSobrePais = obj.getJSONObject("query").getJSONObject("pages").getJSONObject(page).getString("extract");
    page = "";
    Log.i("texte",textoSobrePais);
    txtInfoPais = findViewById(R.id.txtInfoPais);
    txtInfoPais.setText(textoSobrePais);
} catch (JSONException e) {
    e.printStackTrace();
}

}

这就是它崩溃时给我的错误: https://pastebin.com/PJh5r36u

有人能帮忙吗


共 (2) 个答案

  1. # 1 楼答案

    不能从非UI线程更新UI组件。在UI线程上运行TextView的更新,如下所示:

     runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    txtInfoPais.setText(textoSobrePais);
                }
     });
    
  2. # 2 楼答案

    我们无法从后台线程更新UI。你必须在主线程上设置文本

    像这样在主线程上运行

    runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    txtInfo.setText(textoPais);
                }
     });