【问题标题】:Is JsonRequest<String> a good idea?JsonRequest<String> 是个好主意吗?
【发布时间】: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);

这里永远不会触发监听器,日志不会显示。

有什么线索吗?

谢谢!

【问题讨论】:

    标签: android json api web-services android-volley


    【解决方案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 执行请求的。

    【讨论】:

      猜你喜欢
      • 2010-11-05
      • 1970-01-01
      • 2013-04-01
      • 2010-12-28
      • 2010-10-19
      • 2017-01-13
      • 2010-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多