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 работает в моем приложении.

Другие вопросы по тегам