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.