[Resolvido] HttpURLConnection - SocketTimeoutException

Dia pessoal,

Preciso muito de sua ajuda de vocês.

Hoje tenho um aplicativo onde faço a atualização de dados pelo HTTP (HttpURLConnection) onde no meu WebServer disponibilizo os arquivos zip para download e upload. Ate aqui legal!

Estou utilizando o HttpURLConnection, pois, nele é o que eu tenho o maior conhecimento no momento e até pelo pouco tempo que tenho para dar a solução para o meu problema.

Vamos lá, vou explicar o ?problema?.

Na classe que estende AsyncTask, tenho 4 métodos e cada método com sua URL para acessar o webserver, são eles:

  • autenticandoUsuario
  • enviadoDados (upload)
  • recebendoDados (download)
  • desconectandoUsuario.

O meu maior problema é quando a internet do celular está lenta (estoura o pacote de dados e a operadora que reduz a velocidade de navegação), da muitos erros de comunicação, tem alguma forma de fazer um controle mais eficaz/seguro?

O erro que ocorre é ? java.net.SocketTimeoutException: failed to connect to /XXX.XX.XXX.XXX (port XXXX) after 2000ms?.

Abaixo um dos metodos:

private String autenticandoUsuario(String sUrl, Comunicacao vo) {
		HttpURLConnection connection = null;
		StringBuffer sb = new StringBuffer();
		try {
			URL url = new URL(sUrl+"/autenticacao?AFVUSUARIO="+vo.getUsuario()+"&AFVSENHA="+vo.getSenha());
			connection = (HttpURLConnection) url.openConnection();
			connection.setInstanceFollowRedirects(true);
			HttpURLConnection.setFollowRedirects(true);
			connection.setReadTimeout(setReadTimeout); 
			connection.setConnectTimeout(setConnectTimeout);
			connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
			connection.setDoInput(true);  
			connection.setDoOutput(false);  
			connection.setUseCaches(false);  
			InputStream is = connection.getInputStream();
			int ch;
			while((ch = is.read()) != -1){
				sb.append( (char)ch );
			}
			is.close();
			return sb.toString();
		} catch (Throwable e) {
			ExceptionAFV.setMsgErro(e, cxt, false);
//			if (e.getMessage().toUpperCase().contains("FAILED TO CONNECT TO")){
//				publishProgress("CONEXÃO DE DADOS ESTÁ LENTA.","true","0","0");
//			}
			return "A4";
		} finally {
			if (connection != null)
				connection.disconnect();
		}
	}

Preciso muito dar um solução melhor para essa rotina, espero que possam me ajudar.
Não posso que meu aplicativo dependa muito de um WiFi, pois, não vamos encontrar o wifi disponível em qualquer lugar.

Obrigado.

Galera, resolvi, não sei se é a melhor maneira, também não sei se terei problema la na frente.
Mais até então, a coisa ta fluindo;

Criei um contador (até 10) de timeout com um sleep de 2 segundos dentro desse métodos.

Acho que sleep seja prejudicial ao codigo.

Normalmente a solução é aumentar o TIMEOUT para mais de 20 segundos e se estourar exatamente SocketTimeoutException mostrar para o usuario.