如何将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("数据获取失败"); } } }
关键修正点解释:
- 主线程初始化UI组件:在
onCreate中初始化TextView,确保我们是在主线程访问UI元素,避免线程安全问题。 - AsyncTask返回类型调整:把AsyncTask的返回类型从
String改为Integer,这样doInBackground可以直接返回解析后的整数,无需额外的变量转换。 - UI操作移至
onPostExecute:onPostExecute是AsyncTask中唯一运行在主线程的方法之一,在这里更新TextView是安全的。 - 正确转换整数为字符串:使用
String.valueOf(sunriseTime)把整数转成字符串,确保TextView显示的是你想要的数字,而不是尝试查找不存在的资源ID。
另外,记得检查你的JSONParser.AmbilJson()方法是否处理了网络请求的异常(比如IOException),如果网络请求失败,这个方法应该返回null,这样我们的代码就能在onPostExecute中处理失败情况。
内容的提问来源于stack exchange,提问作者Qube
相关产品推荐
相关产品推荐

