2

我将开发一个向服务器发送一些请求的 android 应用程序。这些请求可能需要很长时间才能在服务器端处理;可能是 10 秒、1 分钟甚至更长。我使用 HTTP 方法将请求发送到服务器(例如 get 或 post)。我想知道以后如何通知我在服务器上的请求结果?换句话说,考虑到这种长时间的延迟,我如何才能从服务器接收我的请求的响应。

可以使用哪种方法或技术来处理这种情况?

更新: 我的问题不是关于如何长时间保持 HTTP 连接打开或如何重试。由于第一个 HTTP 请求可以用诸如确认之类的东西来响应(意味着您的请求正在进行中)但是我想知道如何接收属于很久以前的请求的响应。 在此处输入图像描述

4

4 回答 4

2

保持套接字连接打开超过 1 分钟听起来不是一个好主意。

为此,我会推荐Firebase Cloud Messaging

只需将数据发布到服务器。服务器完成任务后,会将结果发送回应用程序。

正如您所说,FCM 消息无法保证,FCM 消息传递失败的情况很少见。如果设备在预期时间内没有收到消息,您可以再次调用服务器并请求旧服务器调用的结果。

于 2017-10-25T08:34:29.560 回答
0

首先,如果你需要做一个长时间运行的任务,你最好的选择是使用android services。在您的情况下,您将希望使用仅持续完成网络操作的服务,因此您需要一个 IntentService,这是一个简单且官方的文档来设置您的服务。

之后,您需要在 Activity 中设置一个BroadcastReceiver来接收您必须在您的 intentService 结束时发送的数据。

至于您的超时问题,@iaindownie 确实回答了这个问题。

希望这可以帮助

于 2017-10-25T08:56:37.307 回答
0

https://github.com/loopj/android-async-http

用于发出异步 http 请求的好库。

您可以使用

 AsyncHttpClient client = new AsyncHttpClient();
client.get("https://www.google.com", new AsyncHttpResponseHandler() {

    @Override
    public void onStart() {
        // called before request is started
    }

    @Override
    public void onSuccess(int statusCode, Header[] headers, byte[] response) {
        // called when response HTTP status is "200 OK"
    }

    @Override
    public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) {
        // called when response HTTP status is "4XX" (eg. 401, 403, 404)
    }

    @Override
    public void onRetry(int retryNo) {
        // called when request is retried
    }
});
于 2017-10-25T08:30:41.590 回答
0

如果您使用 Volley 来处理您的请求和响应,您可以调整默认超时。

myRequest.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 3, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

默认情况下,我认为 DEFAULT_TIMEOUT_MS 设置为 2.5 秒,因此在我的示例中,我将其保持打开状态,等待 7.5 秒的响应。您可以扩展它,但我建议在扩展它之前加速服务器?

于 2017-10-25T08:31:25.583 回答