Android Studio中Volley请求场景下onCreate打印test为0而非3的原因问询
问题核心原因
你遇到的输出异常完全是Volley异步执行机制导致的,和代码逻辑错误无关,具体原因拆解如下:
- Volley的网络请求默认在子线程执行,你调用
queue.add(request)只是把请求加入请求队列,不会阻塞当前主线程的代码执行 onCreate方法的执行是在主线程,当你调用loadData()之后,主线程会立刻往下执行System.out.println语句,此时Volley的网络请求还没完成,onResponse回调还没被触发,test变量还保留初始值0,所以输出为0- 你把打印逻辑放到按钮点击回调里能输出3的原因是:点击按钮的时机远晚于Volley请求完成的时间,此时
onResponse已经执行完毕,test已经被累加为3了
验证方案
你可以做个简单测试验证这个逻辑:把打印语句直接放到onResponse回调里test累加完成的代码后面,此时打印的test值必然是3:
@Override public void onResponse(JSONObject response) { try { JSONArray jsonArray = response.getJSONArray(name of json array); for (int i=0;i<3;i++){ test=test+1; } // 新增打印,此时能拿到正确值 System.out.println("the number test in onResponse is "+test); } catch (JSONException e){ e.printStackTrace(); } }
补充说明
如果你的后续逻辑依赖网络请求返回的结果,必须把逻辑写在onResponse回调中,或者用回调接口、LiveData之类的观察者模式实现结果通知,不能直接在启动请求的方法后面同步读取数据。
内容的提问来源于stack exchange,提问作者Hoang
相关产品推荐
相关产品推荐

