【问题标题】:Volley long HTTPS Request never responsedVolley long HTTPS 请求从未响应
【发布时间】:2019-09-13 10:27:24
【问题描述】:

我创建了一个接收 HTTPS 后端的 volley 请求。

RequestQueue queue = Volley.newRequestQueue(uiCallback.getContext(),
    new SSLVerification().getHurlStack(uiCallback.getContext()));

JsonObjectRequest req = new JsonObjectRequest(Request.Method.GET,
    requestUrl, null, new Response.Listener<JSONObject>() {
    ...
}
req.setRetryPolicy(new DefaultRetryPolicy(3_600_000, 0, 0));

queue.add(req);

在manifest中,我添加了Internet权限如下:

<uses-permission android:name="android.permission.INTERNET" />

对于只需要很短时间的请求,一切正常。

但如果响应在请求后 3 分钟后出现,则应用程序不会收到任何信息。

在后端,我设置了一个断点。 3 分钟后,我让后端向应用程序发送响应,但没有任何反应。没有成功,没有错误,什么都没有。

如果我在没有SSLVerification 的情况下发出 HTTP 请求,那么我也会在 6 分钟后收到响应。相反,超过 3 分钟的 HTTPS 请求根本不想工作。

更改RetryPolicy 以发出许多请求,这只是一种解决方法,不是一种选择。

【问题讨论】:

  • 请尝试缓存策略....*.com/questions/16781244/…。我不确定,但它可能会有所帮助。
  • 使用 Postman 在 HTTPS 中尝试 api,看看是否有任何响应。也可以在 volley 中查看使用 onErrorResponse 的日志。
  • 就是这样。使用邮递员 https 也可以工作 5 分钟。在 Volley 3 分钟后 nothing

标签: java android https android-volley response


【解决方案1】:

如果我在没有 SSLVerification 的情况下发出 HTTP 请求,那么我也会在 6 分钟后收到响应。相反,超过 3 分钟的 HTTPS 请求根本不想工作。

这可以表明您的服务器是否超时?

Occasionally, Volley fails to return a response from the server

【讨论】:

  • 服务器也在 6 分钟后通过 HTTPS 发送答案,但 volley 没有收到。
【解决方案2】:

响应在设备中接收的时间过长,因此Volley 有一个TimeoutError。在向服务器发送请求之前,您需要修改默认超时值,如下所示。

req.setRetryPolicy(new RetryPolicy() {
    @Override
    public int getCurrentTimeout() {
        return 360000;
    }

    @Override
    public int getCurrentRetryCount() {
        return 5000;
    }

    @Override
    public void retry(VolleyError error) throws VolleyError {

    }
});

queue.add(req);

【讨论】:

  • 我已经设置了req.setRetryPolicy(new DefaultRetryPolicy(3_600_000, 0, 0)); 第一个值是Timeout,我设置为1 小时。但是自我在 3 分钟后没有回来
  • 三分钟很长。您确定当时您可能正在浏览其他活动时上下文没有超出范围吗?你的日志猫说什么?您的代码是否打印任何异常的错误或详细消息?如果是这样,请发布您的 logcat。顺便说一句,您是否尝试按照我建议的方式设置超时?它实际上为我工作了很长时间。
  • 请求被阻止查看。我看到进度条。如果我将 url 设置为 HTTP 而不是 HTTPS 则响应也在 6 分钟后起作用。通过 HTTPS 会返回 logback nothing。你的解决方案我还没试过。
  • 请先尝试解决方案,如果您在 logcat 中发现任何异常情况,请告诉我。如果有什么,请在这里发布。
  • 还是不行。没有回应。日志为空
【解决方案3】:

试试这个

req.setRetryPolicy(new DefaultRetryPolicy(90000, 1, 1f));

【讨论】:

  • 这将第二次发送相同的请求。后端不支持此类处理。