Volley的JsonObjectRequest响应监听器不触发无报错如何解决
问题排查及解决方法
- 首先补全网络权限,在
AndroidManifest.xml中添加网络访问权限,缺少该权限时网络请求会直接静默失败:
<uses-permission android:name="android.permission.INTERNET" />
- 补全
onErrorResponse的错误日志打印,原代码中错误回调是空实现,自然捕获不到任何报错信息,修改如下:
new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.e("VOLLEY_ERROR", error.toString()); // 可额外打印响应码排查服务端错误 if (error.networkResponse != null) { Log.e("ERROR_CODE", String.valueOf(error.networkResponse.statusCode)); } } }
- 给请求添加超时重试策略,Volley默认超时时间较短,弱网环境下容易请求失败无回调:
// 在requestQueue.add(jsonObjectRequest);之前添加以下代码 jsonObjectRequest.setRetryPolicy(new DefaultRetryPolicy( 10000, // 10秒超时 DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT ));
- 检查测试设备/模拟器的网络连通性,直接在设备浏览器中访问请求URL,确认可以正常拿到返回数据。
- 避免异步逻辑误区:Volley请求是异步执行的,
FetchAPI_Data方法调用完成时请求还没返回,不要在调用该方法后立刻读取dcritical等全局变量,变量赋值操作只有在onResponse触发后才会执行,如果需要拿到数据后更新UI,请在onResponse内部执行UI更新逻辑。 - 可优化冗余代码:
response本身就是JSONObject类型,不需要再通过new JSONObject(response.toString())重新创建对象,直接调用response.getString("xxx")即可。 - 可尝试移除URL末尾的斜杠,调整为
String url = "https://corona.lmao.ninja/v2/all";,避免部分服务端路由规则不兼容后缀斜杠的问题。
内容的提问来源于stack exchange,提问作者TheProgrammer21
相关产品推荐
相关产品推荐

