Android Studio中结合Volley与ListView的汇率App无法正常拉取API数据
汇率展示APP数据拉取失败问题排查与修复
已定位的代码错误(直接导致数据无法展示)
- JSON解析逻辑与接口返回结构不匹配
你调用的api.exchangeratesapi.io/latest接口返回的rates字段为键值对格式的JSONObject,并非JSONArray。但现有代码用response.getJSONArray("rates")取值,会直接抛出JSONException,中断整个解析流程;同时循环内再次取rates字段的逻辑也和接口结构不匹配。 - ListView未配置绑定适配器
代码中mCurrencies.(rates)为无效语法,ListView无法直接接收字符串渲染内容,必须搭配Adapter绑定数据源,当前没有初始化任何Adapter,就算解析出数据也无法展示。
常见遗漏配置
如果未在AndroidManifest.xml中声明INTERNET网络权限,Volley会直接触发错误回调,完全无法发起网络请求。
可直接复用的修复代码
public class MainActivity extends AppCompatActivity { private ListView mCurrencies; private RequestQueue mQueue; // 新增:列表数据源、适配器 private ArrayList<String> currencyShowList; private ArrayAdapter<String> listAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mCurrencies = findViewById(R.id.currencies); Button button = findViewById(R.id.button); // 初始化列表与适配器 currencyShowList = new ArrayList<>(); listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, currencyShowList); mCurrencies.setAdapter(listAdapter); mQueue = Volley.newRequestQueue(this); button.setOnClickListener(v -> jsonParse()); } private void jsonParse() { String url = "https://api.exchangeratesapi.io/latest"; JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null, response -> { try { // 清空旧数据避免重复加载 currencyShowList.clear(); // 按接口结构取JSONObject类型的rates字段 JSONObject ratesObj = response.getJSONObject("rates"); // 遍历所有货币键值 Iterator<String> currencyKeys = ratesObj.keys(); while (currencyKeys.hasNext()) { String code = currencyKeys.next(); double rate = ratesObj.getDouble(code); currencyShowList.add(code + " : " + rate); } // 通知列表刷新数据 listAdapter.notifyDataSetChanged(); } catch (JSONException e) { e.printStackTrace(); } }, error -> error.printStackTrace() ); mQueue.add(request); } }
需补充的Manifest配置(在
<application>标签同级位置添加):<uses-permission android:name="android.permission.INTERNET" />
内容的提问来源于stack exchange,提问作者mintautas
相关产品推荐
相关产品推荐

