Для меня тайм-аут не использовался, если мы потеряли соединение (для проверки: выключить WiFi). Поэтому я написал метод, который пытается загрузить файл до X раз, ожидая Y миллисекунд между каждой попыткой:
public static byte[] getByteArrayFromURL(String url, int maxTries, int intervalBetweenTries) throws IOException {
try {
return Utils.getByteArrayFromURL(url);
}
catch(FileNotFoundException e) { throw e; }
catch(IOException e) {
if(maxTries > 0) {
try {
Thread.sleep(intervalBetweenTries);
return getByteArrayFromURL(url, maxTries - 1, intervalBetweenTries);
}
catch (InterruptedException e1) {
return getByteArrayFromURL(url, maxTries -1, intervalBetweenTries);
}
}
else {
throw e;
}
}
}
Вот метод, который загружает файл и генерирует исключение UnknownHostException:
public static byte[] getByteArrayFromURL(String urlString) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
InputStream in = null;
try {
in = new URL(urlString).openStream();
byte[] byteChunk = new byte[BUFFER_SIZE];
int n;
while ((n = in.read(byteChunk)) > 0) {
out.write(byteChunk, 0, n);
}
}
finally {
if (in != null) {
try { in.close(); }
catch (IOException e) { e.printStackTrace(); }
}
}
return out.toByteArray();
}
Теперь, если файл, который вы хотите загрузить, не существует, метод немедленно завершится сбоем, в противном случае, если будет сгенерировано исключение IOException (например, UnknownHostException), он будет повторять до «maxTries», ожидая «intervalBetweenTries» между каждой попыткой.
Конечно, вы должны использовать это асинхронно.