使用Volley请求JSON数据返回空对象 接口回调仍报错如何解决
问题根源
- Volley网络请求为异步执行,
loadAllData方法将请求加入队列后会立刻返回,不会等待网络请求完成,此时返回的mydata尚未完成赋值,调用就会报错。 - 当前代码未在
JsonObjectRequest的响应回调中触发自定义的DataAsyncResponse回调,无法拿到请求返回的有效结果。
修正方案
第一步 调整GetData类逻辑
去掉loadAllData的返回值,所有结果通过回调传递,同时在请求的响应回调中触发接口方法:
public class GetData{ // 移除返回值,所有结果通过回调传递 public void loadAllData(final DataAsyncResponse callBack){ // 补全JsonObjectRequest的构造逻辑 JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, 你的请求URL, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { // 将请求得到的JSON处理为需要的String格式后触发回调 String mydata = response.toString(); callBack.processFinished(mydata); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // 错误场景可按需通过回调通知 callBack.processFinished(null); } }); AppController.getInstance().addToRequestQueue(jsonObjectRequest); } public interface DataAsyncResponse { void processFinished(String mydata); } }
第二步 调整MainActivity调用逻辑
所有需要使用请求结果的代码必须写在processFinished回调内,不要尝试在onCreate中直接拿返回值赋值:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new GetData().loadAllData(new DataAsyncResponse() { @Override public void processFinished(String mydata) { // 此处的mydata才是请求完成后的有效数据 // 所有需要用到mydata的后续逻辑全部写在此处 if(mydata != null){ // 执行对应操作:更新UI、解析数据、本地存储等 } } }); }
注意事项
- 异步请求的结果只能通过回调获取,不要尝试用成员变量存值后在回调外直接读取,大概率会读取到空值导致崩溃。
- 如果需要先在子线程处理数据再更新UI,可在
processFinished中用runOnUiThread切换到主线程操作。
内容的提问来源于stack exchange,提问作者Hooksta93
相关产品推荐
相关产品推荐

