HttpURLConnection setReadTimeout не работает
Я занимаюсь разработкой приложения, которое требует загрузки данных с сервера.
Я использую следующий код, который работает, за исключением того, что он иногда зависает во время загрузки файла.
try{
URL url = new URL( dlUrl );
con = (HttpURLConnection) url.openConnection();
con.setConnectTimeout(1000); // timeout 1 sec
con.setReadTimeout(1000); // timeout 1 sec
// get file length
int lenghtOfFile = con.getContentLength();
is = url.openStream();
String dir = Environment.getExternalStorageDirectory() + "myvideos";
File file = new File( dir );
if( !file.exists() ){
if( file.mkdir()){
// directory succesfully created
}
}
fos = new FileOutputStream(file + "/" + "video.mp4");
byte data[] = new byte[1024];
long total = 0;
while( (count = is.read(data)) != -1 ){
total += count;
publishProgress((int)((total*100)/lenghtOfFile));
fos.write(data, 0, count);
}
} catch (Exception e) {
Log.e(TAG, "DOWNLOAD ERROR = " + e.toString() );
}
finally{
// close streams
}
Проблема может быть в том, что соединение WIFI, которое я использую, нестабильно или что-то отсутствует в моем коде.
Теперь я хочу добавить обходной путь, когда загрузка останавливается, но, к сожалению, setReadTimeout
кажется, не имеет никакого эффекта!
Я попробовал решения, предложенные в Stackru, но никто не сделал эту работу за меня.
Я пропускаю какие-то настройки?
Любые идеи, почему setReadTimeout не имеет никакого эффекта?
4 ответа
Это новый ответ на летний вопрос, но у меня была похожая проблема в моем коде, которую я смог решить.
Эта строка является проблемой:
is = url.openStream();
Правильный способ получения входного потока - просто получить входной поток от объекта подключения, а не объекта URL.
is = con.getInputStream();
Первый подход, вероятно, открывает другое сетевое соединение отдельно от объекта соединения, полученного путем вызова url.openConnection()
Я понял все это, оценив эту страницу в блоге.
И для любого другого с подобной проблемой, также очень важно вызвать setReadTimout заранее - перед вызовом getInputStream
или же connect
метод на объекте соединения.
Попробуй вот так,
HttpURLConnection uc = (HttpURLConnection) u.openConnection(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(myProxyHost, Integer.parseInt(myProxyPort))));
Возможно, что-то вроде отказа, но вы можете использовать сетевую библиотеку, такую как http://loopj.com/android-async-http/. Я обнаружил, что это помогает облегчить множество утомительных сетевых отладок, таких как то, что вы описываете.
Ниже приведен пример с сайта:
AsyncHttpClient client = new AsyncHttpClient();
String[] allowedContentTypes = new String[] { "image/png", "image/jpeg" };
client.get("http://example.com/file.png", new BinaryHttpResponseHandler(allowedContentTypes) {
@Override
public void onSuccess(byte[] fileData) {
// Do something with the file
}
});
HttpPost httpPostRequest = new HttpPost(URL);
httpPostRequest.getParams().setParameter("http.socket.timeout", new Integer(600000));
пожалуйста, проверьте этот code.its работает в моем приложении.