JsonRequest<String> 是个好主意吗?
Posted
技术标签:
【中文标题】JsonRequest<String> 是个好主意吗?【英文标题】:Is JsonRequest<String> a good idea? 【发布时间】:2020-03-29 11:08:12 【问题描述】:我目前在一个项目中使用 volley,我想发送一个 JSON 正文 并检索一个 String 作为响应。
为此,我创建了一个以 JsonRequest 作为父级的类。
看起来像这样:
public class JAStringRequest extends JsonRequest<String>
private String token;
private Response.Listener<String> listener;
@Nullable
private Response.ErrorListener errorListener;
public JAStringRequest(String token, int method, String url, @Nullable String requestBody, Response.Listener<String> listener, @Nullable Response.ErrorListener errorListener)
super(method, url, requestBody, listener, errorListener);
this.token = token;
this.listener = listener;
this.errorListener = errorListener;
@Override
public Map<String, String> getHeaders() throws AuthFailureError
try
HashMap<String, String> headers = new HashMap<>();
String auth = "Bearer " + token;
headers.put("Authorization", auth);
headers.put("Content-Type", "application/json");
return headers;
catch (Exception e)
Log.e(TAG, "Authentication Failure");
return super.getHeaders();
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response)
Log.d(TAG, "parseNetworkResponse " + response.statusCode);
try
String jsonString =
new String(
response.data,
HttpHeaderParser.parseCharset(response.headers, PROTOCOL_CHARSET));
return Response.success(
jsonString, HttpHeaderParser.parseCacheHeaders(response));
catch (UnsupportedEncodingException e)
return Response.error(new ParseError(e));
@Override
protected void deliverResponse(String response)
super.deliverResponse(response);
Log.d(TAG, "deliverResponse: " + response);
listener.onResponse(response);
@Override
protected VolleyError parseNetworkError(VolleyError volleyError)
Log.d(TAG, "parseNetworkError");
if (volleyError.networkResponse != null
&& volleyError.networkResponse.data != null)
volleyError = new VolleyError(new String(
volleyError.networkResponse.data));
return volleyError;
return null;
问题是我从来没有从 parseNetworkResponse 中检索到响应。 (日志“parseNetworkResponse 200”)
JAStringRequest request = new JAStringRequest(jwtToken, Request.Method.POST, url.toString(), array.toString(),
response ->
if (response.equals("200"))
Log.d(TAG, "DBrequest result: " + key + " => " + response);
else
Log.d(TAG, "DBrequest error: " + key + " => " + response);
isRequestEnded.set(true);
,
error ->
Log.d(TAG, "DBrequest Error message: " + key + " => " + error.getMessage());
);
request.setTag(key);
queue.add(request);
这里永远不会触发监听器,日志不会显示。
有什么线索吗?
谢谢!
【问题讨论】:
【参考方案1】:我通过在我的自定义 JsonRequest 类中添加一个布尔值使其工作。这个布尔值被初始化为 false,然后在 parseNetworkResponse 中传递给 true。 当这个布尔值为真时,我们就会退出。
public class JAStringRequest extends JsonRequest<String>
...
private boolean isResponse = false;
...
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response)
Log.d(TAG, "parseNetworkResponse");
isResponse = true;
...
...
public boolean isResponse()
return isResponse;
queue.add(request);
while (!request.isResponse())
这是我发现使它工作的唯一方法,否则响应永远不会通过 response.listener 。
PS:while 是在 for 循环中作为 LIFO 执行请求的。
【讨论】:
以上是关于JsonRequest<String> 是个好主意吗?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我们在 jsonArrayRequest 中将 jsonRequest 参数设置为 null?
凌空中的 JSONRequest 和 StringRequest 有啥区别