You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将JSON中的Int值解析并显示到TextView(无需列表)

如何将JSON中的整数解析并显示到TextView中

嘿,我看了你的代码,发现几个关键问题导致你没能成功显示JSON里的整数,下面给你逐个分析并提供修正后的方案:

你的代码存在的核心问题:

  • 后台线程操作UI组件:doInBackground是AsyncTask的后台工作线程,Android明确要求所有UI操作(比如设置TextView内容)必须在主线程执行,直接在这里操作TextView会导致崩溃或者无响应。
  • setText(int)的误用:当你直接把整数传给setText()时,Android会误以为这个int是字符串资源的ID(比如R.string.app_name这种),而不是要显示的数字本身,所以不会显示你想要的内容。
  • 冗余的逻辑代码:你先把TextView的内容转成int赋值给baik,紧接着又用JSON里的sunrise值覆盖它,这一步完全没必要,纯粹是多余的操作。

修正后的完整代码示例:

首先,我们要把UI组件的初始化放在主线程(比如Activity的onCreate方法里),然后把UI更新的逻辑移到AsyncTask的onPostExecute方法(这个方法运行在主线程):

// 在Activity类中声明TextView变量
private TextView asetBaik;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.your_activity_layout); // 替换成你的布局文件名
    // 在主线程初始化TextView
    asetBaik = findViewById(R.id.asetangka);
    // 启动AsyncTask获取并解析JSON数据
    new SunDataTask().execute();
}

// 自定义AsyncTask用于后台获取和解析JSON
private class SunDataTask extends AsyncTask<String, Void, Integer> {
    private ProgressDialog loadingDialog;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // 可选:显示加载提示对话框
        loadingDialog = new ProgressDialog(YourActivity.this);
        loadingDialog.setMessage("正在获取数据...");
        loadingDialog.show();
    }

    @Override
    protected Integer doInBackground(String... params) {
        String apiUrl = "https://example.com/api/sun";
        JSONParser jsonParser = new JSONParser();
        JSONObject jsonResponse = jsonParser.AmbilJson(apiUrl);
        
        try {
            if (jsonResponse != null) {
                JSONObject sysData = jsonResponse.getJSONObject("sys");
                // 只在后台解析出sunrise的整数值,返回给主线程
                return sysData.getInt("sunrise");
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        // 解析失败时返回null
        return null;
    }

    @Override
    protected void onPostExecute(Integer sunriseTime) {
        super.onPostExecute(sunriseTime);
        // 关闭加载对话框
        if (loadingDialog != null && loadingDialog.isShowing()) {
            loadingDialog.dismiss();
        }
        // 在主线程安全更新TextView
        if (sunriseTime != null) {
            // 将整数转换为字符串后设置给TextView
            asetBaik.setText(String.valueOf(sunriseTime));
        } else {
            // 解析失败时显示提示文本
            asetBaik.setText("数据获取失败");
        }
    }
}

关键修正点解释:

  1. 主线程初始化UI组件:在onCreate中初始化TextView,确保我们是在主线程访问UI元素,避免线程安全问题。
  2. AsyncTask返回类型调整:把AsyncTask的返回类型从String改为Integer,这样doInBackground可以直接返回解析后的整数,无需额外的变量转换。
  3. UI操作移至onPostExecute:onPostExecute是AsyncTask中唯一运行在主线程的方法之一,在这里更新TextView是安全的。
  4. 正确转换整数为字符串:使用String.valueOf(sunriseTime)把整数转成字符串,确保TextView显示的是你想要的数字,而不是尝试查找不存在的资源ID。

另外,记得检查你的JSONParser.AmbilJson()方法是否处理了网络请求的异常(比如IOException),如果网络请求失败,这个方法应该返回null,这样我们的代码就能在onPostExecute中处理失败情况。

内容的提问来源于stack exchange,提问作者Qube

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:14:34