Saltar al contenido

Obteniendo java.net.SocketTimeoutException: se agotó el tiempo de espera de la conexión en Android

Solución:

He buscado en toda la web y después de leer muchos documentos sobre la excepción de tiempo de espera de conexión, lo que entendí es que, evitar SocketTimeoutException está más allá de nuestro límite. Una forma de manejarlo de manera efectiva es definir un tiempo de espera de conexión y luego manejarlo usando un try-catch cuadra. Espero que esto ayude a cualquiera en el futuro que se enfrente al mismo problema.

HttpUrlConnection conn = (HttpURLConnection) url.openConnection();

//set the timeout in milliseconds
conn.setConnectTimeout(7000);

Soy consciente de que esta pregunta es un poco antigua. Pero dado que me topé con esto mientras investigaba, pensé que una pequeña adición podría ser útil.

Como se indicó, el cliente no puede resolver el error, ya que se trata de un problema relacionado con la red. Sin embargo, lo que puede hacer es volver a intentar conectarse varias veces. Esto puede funcionar como una solución alternativa hasta que se solucione el problema real.

for (int retries = 0; retries < 3; retries++) {
    try {
        final HttpClient client = createHttpClientWithDefaultSocketFactory(null, null);
        final HttpResponse response = client.execute(get);
        final int statusCode = response.getStatusLine().getStatusCode();
        if (statusCode != 200) {
            throw new IllegalStateException("GET Request on '" + get.getURI().toString() + "' resulted in " + statusCode);
        } else {                
            return response.getEntity();
        }
    } catch (final java.net.SocketTimeoutException e) {
        // connection timed out...let's try again                
    }
}

Quizás esto ayude a alguien.

Si esta usando Kotlin + Retrofit + Coroutines entonces solo usa try y catch para operaciones de red como,

viewModelScope.launch(Dispatchers.IO) {
        try {
            val userListResponseModel = apiEndPointsInterface.usersList()
            returnusersList(userListResponseModel)
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }

Donde, la excepción es el tipo de kotlin y no de java.lang

Esto manejará todas las excepciones como,

  1. HttpException
  2. SocketTimeoutException
  3. EXCEPCIÓN FATAL: DefaultDispatcher, etc.

Aquí está mi usersList() función

@GET(AppConstants.APIEndPoints.HOME_CONTENT)
suspend fun usersList(): UserListResponseModel

Nota:
Sus clases de RetrofitClient deben tener esto como client

OkHttpClient.Builder()
            .connectTimeout(10, TimeUnit.SECONDS)
            .readTimeout(10, TimeUnit.SECONDS)
            .writeTimeout(10, TimeUnit.SECONDS)
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *