Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] timeout exception

quando fui testar o uso das flags, o app executou certinho, mas não estava conseguindo salvar as notas pelo webclient. No logcat estava dizendo que era uma timeout exception.

salva: 

java.net.SocketTimeoutException: timeout

alguém pode explicar como resolver o problema?

codigo do webclient:

package br.com.alura.ceep.webclient

import android.util.Log
import br.com.alura.ceep.model.Nota
import br.com.alura.ceep.webclient.model.NotaBody
import br.com.alura.ceep.webclient.services.NotaService

class NotaWebClient {

    private val notaService: NotaService = RetrofitInicializador().notaService
    suspend fun buscaTodas(): List<Nota>? {
        return try {
            val notasResposta = notaService
                .buscaTodas()
            notasResposta.map { notaResposta ->
                notaResposta.nota
            }
        } catch (e: Exception) {
            Log.e("NotaWebClient", "buscaTodas: ", e)
            null
        }
    }

    suspend fun salva(nota : Nota) : Boolean {
        try {
            val resposta = notaService.salva(nota.id, NotaBody(
                titulo = nota.titulo,
                descricao = nota.descricao,
                imagem = nota.imagem
            ))
            return resposta.isSuccessful

        } catch (e: Exception) {
            Log.e("NotaWebClient", "salva: ", e)
        }
        return false
    }

}

codigo do inicializador do retrofit:

class RetrofitInicializador {

    private val interceptor = HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BASIC)
    private val okHttp = OkHttpClient.Builder().addInterceptor(interceptor).build()

    private val retrofit = Retrofit.Builder()
        .addConverterFactory(MoshiConverterFactory.create())
        .baseUrl("https://5db0-200-203-17-56.ngrok.io")
        .client(okHttp)
        .build()

    val notaService = retrofit.create(NotaService::class.java)
}
2 respostas
solução!

O erro java.net.SocketTimeoutException: timeout geralmente ocorre quando há uma demora na resposta do servidor além do tempo limite definido para a requisição. Isso pode acontecer por diversos motivos, como problemas na rede, lentidão do servidor, entre outros.

Para resolver esse problema, você pode considerar algumas abordagens:

  1. Aumentar o Timeout: Aumente o tempo limite da requisição para dar mais tempo para o servidor responder. No seu código do Retrofit, você pode adicionar um tempo limite maior ao construir o OkHttpClient:

    private val okHttp = OkHttpClient.Builder()
        .addInterceptor(interceptor)
        .connectTimeout(30, TimeUnit.SECONDS) // Exemplo: aumentando para 30 segundos
        .readTimeout(30, TimeUnit.SECONDS)
        .writeTimeout(30, TimeUnit.SECONDS)
        .build()
    

    Ajuste os valores de acordo com suas necessidades.

  2. Tratamento de Erros: Adicione um tratamento mais específico para SocketTimeoutException em seu código, para que você possa lidar com essa exceção de maneira diferente. Por exemplo, você pode tentar fazer a requisição novamente em caso de timeout:

    suspend fun salva(nota: Nota): Boolean {
        try {
            val resposta = notaService.salva(nota.id, NotaBody(
                titulo = nota.titulo,
                descricao = nota.descricao,
                imagem = nota.imagem
            ))
            return resposta.isSuccessful
    
        } catch (e: SocketTimeoutException) {
            // Tratar o timeout, por exemplo, tentar novamente a operação
            Log.e("NotaWebClient", "Timeout ao salvar nota")
            // Você pode tentar novamente a operação aqui
        } catch (e: Exception) {
            Log.e("NotaWebClient", "Erro ao salvar nota", e)
        }
        return false
    }
    

    Certifique-se de avaliar os riscos e apropriar a lógica de tratamento de erro conforme necessário.

  3. Verificar a Conexão de Rede: Certifique-se de que o dispositivo está conectado à Internet e a conexão está estável. Você pode adicionar uma verificação antes de fazer a chamada de rede.

  4. Verificar o Servidor: Certifique-se de que o servidor para o qual você está fazendo a requisição está respondendo corretamente e não está sobrecarregado.

Lembre-se de que aumentar o tempo limite pode ser uma solução temporária, e a abordagem correta depende das condições específicas do seu aplicativo e da sua infraestrutura.

Após alguns dias, mudei o link do ngrok, testei novamente e funcionou. Acredito que era apenas uma falha de conexão no dia, mas mesmo assim suas dicas vão me ajudar muito. Obrigado!