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,
- HttpException
- SocketTimeoutException
- 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)