当前位置: 首页 > 知识库问答 >
问题:

无法在异步类的TextView中设置文本[重复]

华英睿
2023-03-14

在我的CountryInfoActivity.java中,我有一个异步类,它从这个网站检索JSON:https://pt.wikipedia.org/w/api.php?format=json

这些是我用来检索数据的类,在最后一个类中,我尝试将数据设置到我的文本视图中。。。顺便说一下,在我的onCreate方法中,我以这种方式调用了这个类newdownloadtask()。执行(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个答案

皇甫德庸
2023-03-14

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

 runOnUiThread(new Runnable() {
            @Override
            public void run() {
                txtInfoPais.setText(textoSobrePais);
            }
 });
岳嘉石
2023-03-14

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

像这样在主线程上运行

runOnUiThread(new Runnable() {
            @Override
            public void run() {
                txtInfo.setText(textoPais);
            }
 });
 类似资料:
  • 这显示了错误 如何将文本设置为? xml如下所示

  • 输入示例:12345.1 期望输出总计金额DueTextField: 12,345.10 实际结果 系统出来println(格式化文本):12345.10//OK totalAmountDueTextField。setText(formattedText):12345.1//这就是问题所在。 以及如何将初始值设置为0.00(当前为0.0)?

  • 我无法在自定义适配器的<code>getView() 我已经尝试了以下解决方案,但它不适合我: 解决方案一 解决方案二 解决方案三 列表视图. xml文件: 下面是我的keep_resing xml文件: 下面是我的适配器代码: 问题是,我无法将文本视图文本更改为“测试”。 注意:如果我通过执行“< code > holder . hello text . gettext()来查看Toast中的值

  • 问题内容: 我可以写一个描述符,返回一个可以等待的未来。 现在,我可以用来获取协程中的值。 如何设置此属性? -> SyntaxError:无法分配给等待表达式 -> TypeError:对象NoneType不能在’await’表达式中使用 -> RuntimeWarning:从未等待协程’set‘ 问题答案: 您尝试执行的操作是不可能的(使用Python 3.5)。 虽然返回Future是明智的

  • 这是classBinderData extends BaseAdapter的getView函数: public View getView(int position,View convertView,ViewGroup parent){代码> 添加一行:字体tf=Typeface.createFromAsset(vi.getContext(). getAsset(),"字体/Roboto_Thin.

  • 我想在useEffect钩子中使用异步post-get请求。这是一种优化策略吗?