Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正在重试http连接_Java_Android - Fatal编程技术网

Java 正在重试http连接

Java 正在重试http连接,java,android,Java,Android,我正在发出http请求。我在一个android平台上,网络操作经常会失败,因为网络连接可能不会立即可用。因此,在完全失败之前,我想尝试相同的连接N次。我在想这样的事情: DefaultHttpClient mHttp = ...; public HttpResponse runHttpRequest(HttpRequestBase httpRequest) throws IOException { IOException last = null; for (int a

我正在发出http请求。我在一个android平台上,网络操作经常会失败,因为网络连接可能不会立即可用。因此,在完全失败之前,我想尝试相同的连接N次。我在想这样的事情:

DefaultHttpClient mHttp = ...;

public HttpResponse runHttpRequest(HttpRequestBase httpRequest) 
    throws IOException
{
    IOException last = null;
    for (int attempt = 0; attempt < 3; attempt++) {
        try {
            HttpResponse response = mHttpClient.execute(httpRequest);
            int statusCode = response.getStatusLine().getStatusCode();
            if (statusCode == 200) {
                return response;
            }
        } catch (IOException e) {
            httpRequest.abort();
            last = e;
        }
    }

    throw last;
}
DefaultHttpClient mHttp=。。。;
公共HttpResponse runHttpRequest(HttpRequestBase httpRequest)
抛出IOException
{
IOException last=null;
for(int-trunt=0;trunt<3;trunt++){
试一试{
HttpResponse response=mHttpClient.execute(httpRequest);
int statusCode=response.getStatusLine().getStatusCode();
如果(状态代码==200){
返回响应;
}
}捕获(IOE异常){
httpRequest.abort();
last=e;
}
}
扔到最后;
}
我最担心的是连接处于某种状态,在随后的重试中无效。换句话说,我是否需要完全重新创建“httpRequest”,我是否应该避免在catch块中调用httpRequest.abort(),而只在最终失败时调用它


谢谢

文档中没有提到会发生这种情况,尽管您必须尝试一下。更重要的是,有一些事情你应该考虑你的代码…

  • 您可能应该公开重试次数,允许调用方指定此值
  • 只有在引发异常时才应重试;除非获得200,否则您当前将重试。但是,如果,例如,你得到一个404。。。这并不意味着你的请求失败,因为网络没有失败。。。相反,您成功地往返到服务器,但服务器根本没有请求的资源。。。因此,在这种情况下重试是没有意义的
  • 实际上,您可能会抑制各种不同类型的异常。除了所有异常的列表之外,记录列表中发生的所有异常并返回某种类型的结果对象(如果所有尝试都失败,则可能为null)可能是有意义的。否则,您将从发生的异常集中抛出一些任意异常,这可能会掩盖失败
  • 现在你只是一次又一次地提出同样的要求。。。如果出现拥挤,你只是在增加拥挤。如果你的IP地址因为太多的活动而被禁止,你很可能会增加它。。。任何类型的重试逻辑都应该具有回退行为,在这种情况下,重试之间会有一定量的等待,并且间隔会随着每次失败而增加

  • A看来这可能会有帮助

    我建议使用AOP和Java注释(我是开发人员):

    @RetryOnFailure(attempts = 3, delay = 5)
    public String load(URL url) {
      return url.openConnection().getContent();
    }