2011-07-26 17 views
35

Me estoy conectando a una fuente RSS simple usando HTTPUrlConnection. Funciona perfectamente Me gustaría agregar un tiempo de espera a la conexión ya que no quiero que mi aplicación se cuelgue en caso de una mala conexión o lo que sea. Este es el código que uso y el método setConnectTimeout no tiene ningún efecto en absoluto.HttpURLConnection setConnectTimeout() no tiene efecto

 HttpURLConnection http = (HttpURLConnection) mURL.openConnection(); 
     http.setConnectTimeout(15000); //timeout after 15 seconds 
... 

Si me ayuda a desarrollar en Android.

+1

dos cosas para su consideración. Si no desea que su aplicación se cuelgue, coloque su método de conexión en un hilo separado. En segundo lugar, dijiste que "funcionó" perfectamente, ¿qué estás haciendo para simular una mala conexión? – Otra

+0

@Otra Lo tengo en un hilo separado utilizando un diálogo de progreso. Lo que básicamente sucede es que si la conexión es buena, la tarea hace lo suyo. Pero si la conexión es mala, el progreso del diálogo permanece alto durante años. Para simular una mala conexión, estoy reduciendo el tiempo de espera. En lugar de darle 15 segundos, 1 segundo.Solo para probar. ¿O es eso incorrecto? –

+3

HttpURLConnection.setReadTimeout (mili sec); –

Respuesta

16

Probablemente sea/tanto:
1) no leo nada de conexión
2) no debe quedar atrapado & controlar la excepción adecuadamente

Como se ha mencionado here, el uso de una lógica similar a esto:

int TIMEOUT_VALUE = 1000; 
try { 
    URL testUrl = new URL("http://google.com"); 
    StringBuilder answer = new StringBuilder(100000); 

    long start = System.nanoTime(); 

    URLConnection testConnection = testUrl.openConnection(); 
    testConnection.setConnectTimeout(TIMEOUT_VALUE); 
    testConnection.setReadTimeout(TIMEOUT_VALUE); 
    BufferedReader in = new BufferedReader(new InputStreamReader(testConnection.getInputStream())); 
    String inputLine; 

    while ((inputLine = in.readLine()) != null) { 
     answer.append(inputLine); 
     answer.append("\n"); 
    } 
    in.close(); 

    long elapsed = System.nanoTime() - start; 
    System.out.println("Elapsed (ms): " + elapsed/1000000); 
    System.out.println("Answer:"); 
    System.out.println(answer); 
} catch (SocketTimeoutException e) { 
    System.out.println("More than " + TIMEOUT_VALUE + " elapsed."); 
} 
52

Usted debe tratar de establecer el tiempo de lectura, así (http.setReadTimeout()). A menudo, un servidor web aceptará felizmente su conexión, pero puede ser lento en realidad al responder a la solicitud.

+0

Esto funcionó para mí. – stevehs17

+1

No funcionaba para mí si estaba conectado a un enrutador pero la conexión a Internet no funciona. –

-1

Intente configurar el ConnectionTimeout antes de abrir la conexión.

+2

¿Cómo - el constructor es un método protegido? – SK9

6

Tuve un problema similar - porque el HttpUrlConnection won't time out mid-download. Por ejemplo, si apaga el wifi cuando la descarga se realiza, el mío continúa diciendo que está descargando, atascado en el mismo porcentaje.

Encontré una solución, usando un TimerTask, conectado a un AsyncTask llamado DownloaderTask. Proveedores:

class Timeout extends TimerTask { 
    private DownloaderTask _task; 

    public Timeout(DownloaderTask task) { 
     _task = task; 
    } 

    @Override 
    public void run() { 
     Log.w(TAG,"Timed out while downloading."); 
     _task.cancel(false); 
    } 
}; 

A continuación, en el circuito de descarga real establece un temporizador para tiempo de espera de error:

    _outFile.createNewFile(); 
        FileOutputStream file = new FileOutputStream(_outFile); 
        out = new BufferedOutputStream(file); 
        byte[] data = new byte[1024]; 
        int count; 
        _timer = new Timer(); 
        // Read in chunks, much more efficient than byte by byte, lower cpu usage. 
        while((count = in.read(data, 0, 1024)) != -1 && !isCancelled()) { 
         out.write(data,0,count); 
         downloaded+=count; 
         publishProgress((int) ((downloaded/ (float)contentLength)*100)); 
         _timer.cancel(); 
         _timer = new Timer(); 
         _timer.schedule(new Timeout(this), 1000*20); 
        } 
        _timer.cancel(); 
        out.flush(); 

Si el tiempo de espera, y no se descarga incluso 1K en 20 segundos, se cancela en lugar de que parece estar siempre descargando.

+0

buena idea para evitar la conexión continua y la descarga :) –

2

Tenía el mismo problema. Establecer el connectionTimeout y el readTimeout no parece devolver la excepción como se esperaba, pero realmente se toma. Me tomó un tiempo comprobar el Método URLConnection() y comprender lo que está sucediendo. En la documentación para setConnectTimeout hay una advertencia

"Si el nombre de host resuelve varias direcciones IP, este cliente probará cada una. Si la conexión a cada una de estas direcciones falla, transcurrirán varios tiempos de espera antes de que el intento de conexión arroje una excepción. " Esto significa que si tiene 10 ips resueltos por su host, su tiempo de espera real será "10 * readTimeoutSet".

Puede comprobar ips para el nombre de host here

1
http.setConnectTimeout(15000); 
http.setReadTimeout(15000); 
Cuestiones relacionadas