我要开发一个Android应用程序,它向服务器发送一些请求。这些请求可能需要很长时间才能在服务器端处理;可能是10秒,1分钟甚至更长。 我使用HTTP方法将请求发送到服务器(例如get或post)。我想知道如何在服务器上通知我的请求结果?换句话说,考虑到这个长时间的延迟,如何从服务器接收我的请求响应。
可以使用哪种方法或技术来处理这种情况?
更新 我的问题不是关于如何长时间保持HTTP连接打开或如何重试。由于第一个HTTP请求可以通过诸如确认之类的方式进行响应(意味着您的请求正在进行中),但我想知道如何接收属于很久以前的请求的响应。
答案 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确实回答了这个问题。
希望这有帮助