Java 哪些HttpURLConnection方法可以重新尝试Twitter?

Java 哪些HttpURLConnection方法可以重新尝试Twitter?,java,android,http,Java,Android,Http,以下java代码在IntentService中运行;它起作用了;它将图像上传到twitter。 在每次抛出IOException的调用中,我都用一个单独的try-catch对其进行编码。 我已经删除了。。。点,使它更快地阅读 try { con = (HttpURLConnection) new URL(Constants.TWITTER_ENDPOINT_UPLOAD_MEDIA).openConnection(); } catch (IOException e) { e.pr

以下java代码在IntentService中运行;它起作用了;它将图像上传到twitter。 在每次抛出IOException的调用中,我都用一个单独的try-catch对其进行编码。 我已经删除了。。。点,使它更快地阅读

try {
    con = (HttpURLConnection) new URL(Constants.TWITTER_ENDPOINT_UPLOAD_MEDIA).openConnection();
} catch (IOException e) {
    e.printStackTrace();
}

...

con.setDoOutput(true);
try {
    os = con.getOutputStream();
} catch (IOException e) {
    e.printStackTrace();
}

DataOutputStream out = new DataOutputStream(os);
try {
    write(out, boundary + "\r\n");
    ...
} catch (IOException e) {
    e.printStackTrace();
}

try {
    statusCode = con.getResponseCode();
} catch (IOException e) {
    e.printStackTrace();
}
我的问题是: 将这些调用中的一个或多个放在重试循环中是否有意义,如下所示:

for (int i = 0; ; i++) {
    try {
        httpURLConnection = (HttpURLConnection) new URL(Constants.TWITTER_ENDPOINT_UPLOAD_MEDIA).openConnection();
        break;
    }
    catch (IOException e) {
        if (i < 3) {
            continue;
        }
        else {
            reportErrorToCallingActivity();
            return;
        }
    }
}
我应该重新运行多少代码:一直运行到openConnection? 我只是无法从文件中看出这一点,
我不想只是猜测该怎么办。希望你能帮忙

我很感激这可能会大大减少,但我认为这里的好处是,当您捕获到您的
IOException
s时,您所做的就是将它们记录到控制台上。换句话说,您的代码不知道该做什么,它(或连接)处于什么状态,或者如何继续。鉴于检查异常消息文本是一种不好的做法,异常类型不能提供足够的信息。在这种情况下,最简单和最诚实的做法是重新调用原始异常,希望调用代码了解更多/能够更好地处理错误

如果在任何阶段,您(或您的代码)确信您能够完全/大体上处理异常,那么可以像当前代码那样进行显式的尝试/捕获。但是如果您不这样做,您的方法应该“fess up”并声明它
抛出IOException
,而根本不尝试处理它们。(确保您有一个
finally
块来清理您在此过程中创建的任何资源!)

如果您的方法是诚实的,并且在其自身之后进行了清理,那么调用方法可能会在循环中重试—正如您的第二个代码示例所示。但是,如果没有任何重试控制(尝试次数、退避等)和连接API的良好指导,继续尝试可能是不明智的,可能会浪费资源、限制速率、违反T&C等

更好的解决方案是获得一个Twitter访问库,该库返回有意义的状态消息,并可能处理自己的重试

编辑:

到目前为止,最有用的一行是
statusCode=con.getResponseCode()它为您提供了一个可以检查的值。一般来说,如果您返回2xx,则您的请求已成功,4xx表示您的代码出错,5xx表示Twitter出错。至少,如果你——也许你应该——放弃而不是试图解决它,你可以调整你的错误信息


看起来420和429最好表明您可以重试。但是,您需要更加小心地执行,而不仅仅是在无休止的循环中重复您的请求。您一定要阅读文档以获得指导。

我知道这可能会大大减少,但我认为这里的好处是,当您捕获到您的
IOException
时,您所做的就是将它们记录到控制台上。换句话说,您的代码不知道该做什么,它(或连接)处于什么状态,或者如何继续。鉴于检查异常消息文本是一种不好的做法,异常类型不能提供足够的信息。在这种情况下,最简单和最诚实的做法是重新调用原始异常,希望调用代码了解更多/能够更好地处理错误

如果在任何阶段,您(或您的代码)确信您能够完全/大体上处理异常,那么可以像当前代码那样进行显式的尝试/捕获。但是如果您不这样做,您的方法应该“fess up”并声明它
抛出IOException
,而根本不尝试处理它们。(确保您有一个
finally
块来清理您在此过程中创建的任何资源!)

如果您的方法是诚实的,并且在其自身之后进行了清理,那么调用方法可能会在循环中重试—正如您的第二个代码示例所示。但是,如果没有任何重试控制(尝试次数、退避等)和连接API的良好指导,继续尝试可能是不明智的,可能会浪费资源、限制速率、违反T&C等

更好的解决方案是获得一个Twitter访问库,该库返回有意义的状态消息,并可能处理自己的重试

编辑:

到目前为止,最有用的一行是
statusCode=con.getResponseCode()它为您提供了一个可以检查的值。一般来说,如果您返回2xx,则您的请求已成功,4xx表示您的代码出错,5xx表示Twitter出错。至少,如果你——也许你应该——放弃而不是试图解决它,你可以调整你的错误信息


看起来420和429最好表明您可以重试。但是,您需要更加小心地执行,而不仅仅是在无休止的循环中重复您的请求。您应该阅读文档以获得指导。

您知道,您可以将所有代码放在一个try/catch块中。您不需要对每条语句进行单独检查。对于整个代码块,您只需捕获一次IOException。是的,但是您丢失了信息:导致异常的确切方法。您知道,您可以将所有代码放在一个try/catch块中。您不需要对每条语句进行单独检查。对于整个代码块,您只需捕获一次IOException。是的,但是您丢失了信息:究竟是哪个方法导致了异常。抛出这些异常对我没有帮助,因为我会将它们抛出到自己的代码中,这当然是不明智的。顺便说一句,我用twitter4j库编写了这篇推特文章,但它确实很大,超出了我的dex极限。麻生太郎,它就像你描述的那样处理这些异常:它将它们传递给我,所以我仍然处于同样的僵局:我不知道重新尝试是否明智,或者仅仅是一次失败
statusCode = con.getResponseCode();