Volley JsonArrayRequest请求异常:始终触发onError()问题求助
解决Volley JsonArrayRequest始终触发onError()的问题
我之前也踩过Volley请求一直走错误回调的坑,结合你的代码和描述,咱们一步步排查和解决:
1. 先修正URL的编码问题
你的请求URL里用了&,这是HTML的转义字符,Volley无法识别,会导致请求地址无效。把&替换成普通的&即可:
String correctUrl = "http://api.aladhan.com/v1/timingsByCity?city=Dubai&country=United%20Arab%20Emirates";
2. 检查Android明文HTTP限制(Android 9+)
从Android 9开始,系统默认禁止明文HTTP请求,只允许HTTPS。如果你的接口是HTTP的,需要配置允许明文访问:
- 在
res/xml目录下创建network_security_config.xml,内容如下:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">api.aladhan.com</domain> </domain-config> </network-security-config>
- 然后在
AndroidManifest.xml的application标签里添加引用:
<application ... android:networkSecurityConfig="@xml/network_security_config"> ... </application>
3. 排查错误详情,精准定位问题
在onErrorResponse里打印错误的具体信息,比如状态码、错误描述,这能帮你快速知道是连接问题、服务器错误还是参数错误:
@Override public void onErrorResponse(VolleyError error) { if (error.networkResponse != null) { Log.e("VolleyDebug", "状态码: " + error.networkResponse.statusCode); Log.e("VolleyDebug", "响应内容: " + new String(error.networkResponse.data)); } Log.e("VolleyDebug", "错误信息: " + error.getMessage()); }
4. 确保上下文和请求队列的有效性
- 初始化
RequestQueue时,尽量用Application上下文(避免内存泄漏):
RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
- 如果是在Fragment中调用,确保用
getActivity()作为上下文,不要直接用Fragment的this。
5. 再次确认网络权限
虽然你说已经添加,但再检查下AndroidManifest.xml里的权限是否放在根标签下(不是application内部):
<uses-permission android:name="android.permission.INTERNET" />
最后给你整理好的完整请求代码:
RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext()); String url = "http://api.aladhan.com/v1/timingsByCity?city=Dubai&country=United%20Arab%20Emirates"; JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.GET, url, null, new Response.Listener<JSONArray>() { @Override public void onResponse(JSONArray response) { try { // 在这里处理你的JSON解析逻辑 for (int i = 0; i < response.length(); i++) { JSONObject obj = response.getJSONObject(i); // 提取数据... } } catch (JSONException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // 打印错误信息排查 if (error.networkResponse != null) { Log.e("VolleyDebug", "状态码: " + error.networkResponse.statusCode); try { Log.e("VolleyDebug", "响应内容: " + new String(error.networkResponse.data, "UTF-8")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } Log.e("VolleyDebug", "错误信息: " + error.getMessage()); } }); requestQueue.add(jsonArrayRequest);
内容的提问来源于stack exchange,提问作者Muhammad Faizan
相关产品推荐
相关产品推荐

