Saltar al contenido

Obtener java.net.SocketTimeoutException: conexión agotada en Android

Investigamos por diferentes foros para así darte la respuesta a tu duda, en caso de dudas déjanos tu comentario y contestamos con gusto.

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, evitando 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 cualquier persona en el futuro que esté enfrentando el 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 como 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 es 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                
    

Tal vez esto ayude a alguien.

Si estás usando Kotlin + Retrofit + Corrutinas 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, Excepción es tipo de kotlin y no de java.lang

Esto manejará cada excepción como,

  1. HttpException
  2. Excepción de tiempo de espera de socket
  3. EXCEPCIÓN FATAL: DefaultDispatcher, etc.

Aquí está mi usersList() función

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

Nota:
Sus Clases RetrofitClient deben tener esto como client

OkHttpClient.Builder()
            .connectTimeout(10, TimeUnit.SECONDS)
            .readTimeout(10, TimeUnit.SECONDS)
            .writeTimeout(10, TimeUnit.SECONDS)

Sección de Reseñas y Valoraciones

Te invitamos a añadir valor a nuestra información participando con tu experiencia en las explicaciones.

¡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 *