You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 19:36:03