接收可能需要很长时间的请求的响应

时间:2017-10-25 08:25:00

标签: android httprequest server-side request-response

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

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

更新 我的问题不是关于如何长时间保持HTTP连接打开或如何重试。由于第一个HTTP请求可以通过诸如确认之类的方式进行响应(意味着您的请求正在进行中),但我想知道如何接收属于很久以前的请求的响应。 enter image description here

4 个答案:

答案 0 :(得分:2)

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

我建议 Firebase云消息传递

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

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

答案 1 :(得分: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
    }
});

答案 2 :(得分: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秒的响应。您可以对此进行扩展,但我建议您在将此扩展到太远之前加快服务器速度?

答案 3 :(得分:0)

首先,如果您需要执行长时间运行的任务,最好的选择是使用android services。在您的情况下,您希望使用仅用于网络操作的服务来完成,因此您需要一个IntentService,这里需要simple and official doc来设置您的服务。< / p>

之后,您需要在活动中设置BroadcastReceiver以接收您在intentService结束时必须发送的数据。

关于你的超时问题,@ iindownie确实回答了这个问题。

希望这有帮助