Android使用Volley获取服务端状态码返回值为0及日志顺序异常如何解决?
问题原因
你遇到的问题本质是Volley的网络请求默认是异步执行,不是单纯服务端响应耗时导致的:
- 将请求加入请求队列后,主线程不会阻塞等待网络请求完成,会直接执行后续的日志打印和return语句,此时
deleteStatus还没有被回调修改,所以返回值始终是初始值0。 - 日志顺序颠倒的原因同理:
parseNetworkResponse是网络请求完成后才会触发的工作线程回调,执行时间晚于主线程的return逻辑,所以对应日志会最后打印。
修复方案
不能通过方法返回值获取异步请求的结果,需要通过回调接口的方式,在请求完成拿到状态码后再执行UI更新逻辑,步骤如下:
步骤1:定义回调接口
public interface DeletePetCallback { void onResult(int statusCode); }
步骤2:修改handleDeletePet方法
移除int返回值,新增回调参数,请求完成后通过回调返回状态码,注意UI更新需要在主线程执行:
public void handleDeletePet(int petId, DeletePetCallback callback) { String url = "myurl"; StringRequest request = new StringRequest(Request.Method.DELETE, url + petId, new Response.Listener<String>() { @Override public void onResponse(String response) { // 成功回调默认运行在主线程,可直接更新UI } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { error.printStackTrace(); // 处理错误场景的状态码 int errorCode = error.networkResponse != null ? error.networkResponse.statusCode : -1; if(callback != null) { callback.onResult(errorCode); } } }){ @Override protected Response<String> parseNetworkResponse(NetworkResponse response) { int statusCode = response.statusCode; Log.i("deleted status : ", String.valueOf(statusCode)); // 切到主线程调用回调,保证后续UI操作合法 if(callback != null) { new Handler(Looper.getMainLooper()).post(() -> { callback.onResult(statusCode); }); } return super.parseNetworkResponse(response); } }; MySingletonRequestQueue.getInstance(this.getActivity()).addToRequestQueue(request); }
步骤3:调用方法时传入回调实现
把原来的UI更新逻辑移到回调方法内:
handleDeletePet(currentPet.getPetId(), statusCode -> { Log.i("returned status ", String.valueOf(statusCode)); if (statusCode == 200) { myPetsList.remove(currentPet); myPetsAdapter.notifyItemRemoved(position); Snackbar.make(myPetsRecyclerView, "Deleted Pet " + currentPet.getPetName(), Snackbar.LENGTH_LONG).show(); } else { Snackbar.make(myPetsRecyclerView, "Cannot delete " + currentPet.getPetName() + " since it has events", Snackbar.LENGTH_LONG).show(); myPetsAdapter.notifyItemChanged(position); } });
内容的提问来源于stack exchange,提问作者craftdeer
相关产品推荐
相关产品推荐

