Android Volley 为啥 JsonObjectRequest 不调用 onResponse

Posted

技术标签:

【中文标题】Android Volley 为啥 JsonObjectRequest 不调用 onResponse【英文标题】:Android Volley Why does JsonObjectRequest does not call onResponseAndroid Volley 为什么 JsonObjectRequest 不调用 onResponse 【发布时间】:2021-07-27 18:29:54 【问题描述】:

我正在努力让我的凌空JsonObjectRequest 工作。调用getById() meth 时,不会调用onResponse()。我已经有一个工作职位请求。所以连接参数是正确的。我在 LogCat 中没有收到任何错误响应或有用的响应。

我创建了一个测试类来隔离getById() 方法。

public class Test 

    Customer customer;
    public Customer getById(int id) 

        Log.i("CustomerDAO getById", "getById called");
        String urlJsonObj = "http://192.168.0.39:3000/Customers/" + id;
        JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, urlJsonObj, null, new Response.Listener < JSONObject > () 

            @Override
            public void onResponse(JSONObject response) 
                try 
                    // Parsing json object response
                    // response will be a json object

                    customer = new Customer(response.getInt("customernumber"), response.getString("name"),
                        response.getString("lastname"), response.getString("phonenumber"),
                        response.getInt("addressid"), response.getString("password"));
                 catch (JSONException e) 
                    Log.e("JSON Exception:", e.toString());
                

            
        , new Response.ErrorListener() 

            @Override
            public void onErrorResponse(VolleyError error) 
                Log.e("GetByIdErrorResponse", error.toString());
            
        );

        AppController.getInstance().addToRequestQueue(request);
        return customer;
    

这是单例 RequestQueue 类。

public class AppController extends Application 

    public static final String TAG = AppController.class
            .getSimpleName();

    private RequestQueue mRequestQueue;

    private static AppController mInstance;

    @Override
    public void onCreate() 
        super.onCreate();
        mInstance = this;
    

    public static synchronized AppController getInstance() 
        return mInstance;
    

    public RequestQueue getRequestQueue() 
        if (mRequestQueue == null) 
            mRequestQueue = Volley.newRequestQueue(getApplicationContext());
            Log.i("RequestQueue= ", mRequestQueue.toString());
        

        return mRequestQueue;
    

这就是我调用getById() 方法的方式

Test test = new Test();
Entities.Customer check = test.getById(1);

【问题讨论】:

这里是响应 "customernumber":1,"name":"string","lastname":"string","phonenumber":"string","addressid":1,"密码":"字符串" 【参考方案1】:

您的代码中有一些错误。由于 volley 是一个异步网络库,因此您无法像之前那样从网络返回结果。您正在 OnResponse 内部初始化 Customer 模型类并从外部返回它。 那么当你执行这个操作时会发生什么

创建请求 -> 添加到请求队列 -> getById() 方法返回 null

return 语句最终不会等到响应到达。你每次都会得到空值。所以你要做的就是在 API 返回结果或错误时实现自定义回调。

为内部测试类创建一个接口以处理 API 响应。

interface APICallback 
  void onSuccess(Customer customer);
  void onError(String error);

将这些接口实现与 id 一起传递给 getById() 方法

public void getById(int id,APICallback callback) 
  ....

在结果上调用方法

@Override
            public void onResponse(JSONObject response) 
                try 
                    // Parsing json object response
                    // response will be a json object

                    Customer customer = new Customer(response.getInt("customernumber"), response.getString("name"),
                            response.getString("lastname"), response.getString("phonenumber"),
                            response.getInt("addressid"), response.getString("password"));
                    callback.onSuccess(customer);
                 catch (JSONException e) 
                    Log.e("JSON Exception:", e.toString());
                

            
 @Override
            public void onErrorResponse(VolleyError error) 
                Log.e("GetByIdErrorResponse", error.toString());
                callback.onError(error.toString());
            

现在您可以按如下方式调用 getById()

Test test = new Test();
        test.getById(1, new Test.APICallback() 
            @Override
            public void onSuccess(Customer customer) 

            

            @Override
            public void onError(String error) 

            
        );

【讨论】:

以上是关于Android Volley 为啥 JsonObjectRequest 不调用 onResponse的主要内容,如果未能解决你的问题,请参考以下文章

网络通信框架Volley使用详细说明

Volley使用

为啥 Volley 回退到 SSLV3?

为啥 Volley 不在 getParams() 中发送变量?

NullPointerException:尝试从字段 'com.android.volley.Cache$Entry com.android.volley.Response.cacheEntry 读取

[转] Android Volley完全解析,初识Volley的基本用法