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 不在 getParams() 中发送变量?
NullPointerException:尝试从字段 'com.android.volley.Cache$Entry com.android.volley.Response.cacheEntry 读取