提问人:VSB 提问时间:10/25/2017 最后编辑:PhantômaxxVSB 更新时间:3/31/2021 访问量:6691
收到可能需要很长时间的请求响应
receiving a response of a request which may take long time
问:
我将开发一个 android 应用程序,它向服务器发送一些请求。这些请求可能需要很长时间才能在服务器端处理;可能是 10 秒、1 分钟甚至更长时间。 我使用HTTP方法将请求发送到服务器(例如get或post)。我想知道以后如何通知我在服务器上的请求结果?换句话说,考虑到这么长的延迟,我如何从服务器收到我的请求的响应。
可以使用哪种方法或技术来处理这种情况?
更新:我的问题不是关于如何长时间保持HTTP连接打开或如何重试。由于第一个HTTP请求可以用确认之类的东西来响应(意味着您的请求正在进行中),但是我想知道我怎样才能收到很久以前的请求的响应。
答:
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
}
});
评论
如果使用 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 秒。你可以扩展它,但我建议在扩展得太远之前加快服务器速度?
评论
保持插座连接打开超过 1 分钟听起来不是一个好主意。
为此,我建议使用 Firebase Cloud Messaging。
只需将数据发布到服务器即可。服务器完成任务后,会将结果发回给应用。
正如您所说,FCM 报文无法保证,FCM 报文的投递失败是很少见的。如果在预期时间内设备中未收到消息,则可以再次调用服务器并请求较旧的服务器调用结果。
评论
首先,如果您需要长时间运行任务,最好的选择是使用 android 服务。在你的例子中,你需要使用一个只对你的网络操作持续的服务,所以你需要一个IntentService,这里有一个简单的官方文档来设置你的服务。
之后,您需要在活动中设置一个 BroadcastReceiver,以接收您必须在 intentService 结束时发送的数据。
至于你超时的担忧,@iaindownie确实回答了这个问题。
希望这会有所帮助
评论