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> 是个好主意吗?的主要内容,如果未能解决你的问题,请参考以下文章

无法在 ftl 文件中映射 jsonRequest 属性

JSONRequest 的 AFNetworking 问题

为啥我们在 jsonArrayRequest 中将 jsonRequest 参数设置为 null?

凌空中的 JSONRequest 和 StringRequest 有啥区别

解决Volley中的JsonObjectRequest jsonRequest参数无法被服务端读取的问题

json相关