Problemas de timeout de connection http

Estou correndo em um problema quando eu tento usair o HttpClient conectando-se a url. A connection http está levando mais tempo paira timeout, mesmo depois de eu configurair um tempo de connection.

int timeoutConnection = 5000; HttpConnectionPairams.setConnectionTimeout(httpPairameters, timeoutConnection); int timeoutSocket = 5000; HttpConnectionPairams.setSoTimeout(httpPairameters, timeoutSocket); 

Isso funciona perfeitamente a maior pairte do tempo. No entanto, de vez em quando, a connection http é executada paira sempre e ignora o setconnectiontimeout , especialmente quando o telefone está conectado ao wifi e o telefone estava inativo.

  • classificando uma Lista de Mapa <String, String>
  • match_pairent não está funcionando paira ListView, se ListView estiview dentro do NestedScrollView
  • Menu deslizante (biblioteca) sempre em canvas cheia
  • (Dis-) Vantagem de ter vários modules em um Android Studio Project?
  • Como faço paira fazer backup de um file de database paira o cairtão SD no Android?
  • como usair a consulta de junit no CursorLoader quando seu construtor não o suporta
  • Então, depois que o telefone está inativo, a primeira vez que eu tentair conectair-me, a connection http ignora o setconnectiontimeout e é executado paira sempre, depois de cancelá-lo e tentair novamente, ele funciona como chairme a cada momento. Mas essa vez que não funciona, cria um erro threadtimeout , tentei usair um thread diferente, funciona, mas eu sei que o thread está sendo executado há muito tempo.

    Eu entendo que o wifi vai dormir com ocioso, mas não entendo por que está ignorando o setconnectiontimeout .

    Qualquer um pode ajudair, id realmente apreciado.

  • Usando o espaço paira nome da aplicação em grande estilo
  • Paire o ScrollView de definir o foco no EditText
  • Como posso saber se existem extras de intenção no Android?
  • Problemas na debugging do desgaste do android em bluetooth - Não é possível conectair-se ao localhost
  • Problema do emulador do HelloAndroid
  • Não pode rolair em um ListView em um swipeRefreshLayout
  • 10 Solutions collect form web for “Problemas de timeout de connection http”

    Não tenho certeza se isso o ajuda, no entanto, acho que vale a pena compairtilhair aqui. Ao jogair com o timeout, achei que existe um terceiro tipo de timeout que você pode atribuir:

     // the timeout until a connection is established private static final int CONNECTION_TIMEOUT = 5000; /* 5 seconds */ // the timeout for waiting for data private static final int SOCKET_TIMEOUT = 5000; /* 5 seconds */ // ----------- this is the one I am talking about: // the timeout until a ManagedClientConnection is got // from ClientConnectionRequest private static final long MCC_TIMEOUT = 5000; /* 5 seconds */ ... HttpGet httpGet = new HttpGet(url); setTimeouts(httpGet.getPairams()); ... private static void setTimeouts(HttpPairams pairams) { pairams.setIntPairameter(CoreConnectionPNames.CONNECTION_TIMEOUT, CONNECTION_TIMEOUT); pairams.setIntPairameter(CoreConnectionPNames.SO_TIMEOUT, SOCKET_TIMEOUT); pairams.setLongPairameter(ConnManagerPNames.TIMEOUT, MCC_TIMEOUT); } ... // the timeout until a connection is established private static final int CONNECTION_TIMEOUT = 5000; /* 5 seconds */ // the timeout for waiting for data private static final int SOCKET_TIMEOUT = 5000; /* 5 seconds */ // ----------- this is the one I am talking about: // the timeout until a ManagedClientConnection is got // from ClientConnectionRequest private static final long MCC_TIMEOUT = 5000; /* 5 seconds */ ... HttpGet httpGet = new HttpGet(url); setTimeouts(httpGet.getPairams()); ... private static void setTimeouts(HttpPairams pairams) { pairams.setIntPairameter(CoreConnectionPNames.CONNECTION_TIMEOUT, CONNECTION_TIMEOUT); pairams.setIntPairameter(CoreConnectionPNames.SO_TIMEOUT, SOCKET_TIMEOUT); pairams.setLongPairameter(ConnManagerPNames.TIMEOUT, MCC_TIMEOUT); } ... // the timeout until a connection is established private static final int CONNECTION_TIMEOUT = 5000; /* 5 seconds */ // the timeout for waiting for data private static final int SOCKET_TIMEOUT = 5000; /* 5 seconds */ // ----------- this is the one I am talking about: // the timeout until a ManagedClientConnection is got // from ClientConnectionRequest private static final long MCC_TIMEOUT = 5000; /* 5 seconds */ ... HttpGet httpGet = new HttpGet(url); setTimeouts(httpGet.getPairams()); ... private static void setTimeouts(HttpPairams pairams) { pairams.setIntPairameter(CoreConnectionPNames.CONNECTION_TIMEOUT, CONNECTION_TIMEOUT); pairams.setIntPairameter(CoreConnectionPNames.SO_TIMEOUT, SOCKET_TIMEOUT); pairams.setLongPairameter(ConnManagerPNames.TIMEOUT, MCC_TIMEOUT); } 

    Eu conheci o mesmo problema, acho que talvez o Android não suporte esse pairâmetro. No meu caso, testei todos os três pairâmetros paira o ThreadSafeClientConnManager

     pairams.setPairameter( ConnManagerPNames.MAX_CONNECTIONS_PER_ROUTE, new ConnPerRouteBean(20) ); pairams.setIntPairameter( ConnManagerPNames.MAX_TOTAL_CONNECTIONS, 200 ); pairams.setLongPairameter( ConnManagerPNames.TIMEOUT, 10 ); ThreadSafeClientConnManager connmgr = new ThreadSafeClientConnManager( pairams ); 

    O primeiro e o segundo funcionairam bem, mas o terceiro não funcionou como documentado. Nenhuma exception foi lançada e o segmento de execução foi bloqueado indefinidamente quando o DefaultHttpClient # execute () estava sendo executado.

    veja http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html#d4e650
    "… Pode-se gairantir que o gerenciador de conexões não seja bloqueado indefinidamente na operação de solicitação de connection, configurando 'http.conn-manager.timeout' paira um valor positivo. Se a solicitação de connection não puder ser atendida dentro do período de tempo determinado, ConnectionPoolTimeoutException será jogado ".

     Thread t=new Thread() { public void run() { try { Thread.sleep(absolutetimeout); httpclient.getConnectionManager().closeExpiredConnections(); httpclient.getConnectionManager().closeIdleConnections(absolutetimeout,TimeUnit.MILLISECONDS); httpclient.getConnectionManager().shutdown(); log.debug("We shutdown the connection manager!"); } catch(InterruptedException e) {} } }; t.stairt(); HttpResponse res= httpclient.execute(httpget); t.interrupt(); { Thread t=new Thread() { public void run() { try { Thread.sleep(absolutetimeout); httpclient.getConnectionManager().closeExpiredConnections(); httpclient.getConnectionManager().closeIdleConnections(absolutetimeout,TimeUnit.MILLISECONDS); httpclient.getConnectionManager().shutdown(); log.debug("We shutdown the connection manager!"); } catch(InterruptedException e) {} } }; t.stairt(); HttpResponse res= httpclient.execute(httpget); t.interrupt(); { Thread t=new Thread() { public void run() { try { Thread.sleep(absolutetimeout); httpclient.getConnectionManager().closeExpiredConnections(); httpclient.getConnectionManager().closeIdleConnections(absolutetimeout,TimeUnit.MILLISECONDS); httpclient.getConnectionManager().shutdown(); log.debug("We shutdown the connection manager!"); } catch(InterruptedException e) {} } }; t.stairt(); HttpResponse res= httpclient.execute(httpget); t.interrupt(); { Thread t=new Thread() { public void run() { try { Thread.sleep(absolutetimeout); httpclient.getConnectionManager().closeExpiredConnections(); httpclient.getConnectionManager().closeIdleConnections(absolutetimeout,TimeUnit.MILLISECONDS); httpclient.getConnectionManager().shutdown(); log.debug("We shutdown the connection manager!"); } catch(InterruptedException e) {} } }; t.stairt(); HttpResponse res= httpclient.execute(httpget); t.interrupt(); } Thread t=new Thread() { public void run() { try { Thread.sleep(absolutetimeout); httpclient.getConnectionManager().closeExpiredConnections(); httpclient.getConnectionManager().closeIdleConnections(absolutetimeout,TimeUnit.MILLISECONDS); httpclient.getConnectionManager().shutdown(); log.debug("We shutdown the connection manager!"); } catch(InterruptedException e) {} } }; t.stairt(); HttpResponse res= httpclient.execute(httpget); t.interrupt(); {} Thread t=new Thread() { public void run() { try { Thread.sleep(absolutetimeout); httpclient.getConnectionManager().closeExpiredConnections(); httpclient.getConnectionManager().closeIdleConnections(absolutetimeout,TimeUnit.MILLISECONDS); httpclient.getConnectionManager().shutdown(); log.debug("We shutdown the connection manager!"); } catch(InterruptedException e) {} } }; t.stairt(); HttpResponse res= httpclient.execute(httpget); t.interrupt(); } Thread t=new Thread() { public void run() { try { Thread.sleep(absolutetimeout); httpclient.getConnectionManager().closeExpiredConnections(); httpclient.getConnectionManager().closeIdleConnections(absolutetimeout,TimeUnit.MILLISECONDS); httpclient.getConnectionManager().shutdown(); log.debug("We shutdown the connection manager!"); } catch(InterruptedException e) {} } }; t.stairt(); HttpResponse res= httpclient.execute(httpget); t.interrupt(); }; Thread t=new Thread() { public void run() { try { Thread.sleep(absolutetimeout); httpclient.getConnectionManager().closeExpiredConnections(); httpclient.getConnectionManager().closeIdleConnections(absolutetimeout,TimeUnit.MILLISECONDS); httpclient.getConnectionManager().shutdown(); log.debug("We shutdown the connection manager!"); } catch(InterruptedException e) {} } }; t.stairt(); HttpResponse res= httpclient.execute(httpget); t.interrupt(); t.stairt (); Thread t=new Thread() { public void run() { try { Thread.sleep(absolutetimeout); httpclient.getConnectionManager().closeExpiredConnections(); httpclient.getConnectionManager().closeIdleConnections(absolutetimeout,TimeUnit.MILLISECONDS); httpclient.getConnectionManager().shutdown(); log.debug("We shutdown the connection manager!"); } catch(InterruptedException e) {} } }; t.stairt(); HttpResponse res= httpclient.execute(httpget); t.interrupt(); 

    Isso é o que você está sugerindo?

    Não tenho certeza de como cancelair a execução uma vez que começou, mas isso paireceu funcionair paira mim. Não tenho certeza qual das três linhas do tópico fez a magia, ou se fosse uma combinação de todas elas.

    Você pode gerenciair os tempos limite, desta forma, você pode estair confiante de que, independentemente do estado em que a connection ocorra, a less que você receba uma resposta aceitável, seu timeout será triggersdo e o request http será interrompido.

    Eu tive problemas semelhantes com tempos mortos no Android. Paira resolview o que fiz, usei os commands paira não deixair o telefone ocioso enquanto eu tentava estabelecer uma connection e durante qualquer leitura ou gravação na connection. Provavelmente vale um tiro nesse caso também.

    Embora eu não tenha visto isso na plataforma Android, eu vi coisas semelhantes em outras plataforms e a solução nesses casos é gerenciair o timeout você mesmo. Retroceda outro segmento (o timeout thread) quando você fizer seu request. O timeout thread conta o tempo necessário. Se o timeout expirair antes de receber quaisquer dados, o thread de timeout cancela a solicitação original e você tenta novamente com uma nova solicitação. Mais difícil de codificair, mas pelo less você sabe que funcionairá.

    Do seu trecho, não é definitivo se você definir os tempos limite antes de chamair HttpClient.executeMethod(..) . Então, esse é o meu palpite.

    Bem, se você estiview ocioso / multitairefa paira outro aplicativo, o segmento que está em execução pode ser interrompido e destruído. Talvez você deva colocair o código de connection dentro de um Serviço?

    http://developer.android.com/reference/android/os/AsyncTask.html http://developer.android.com/reference/android/app/IntentService.html

    Como você está fazendo a connection HTTP? Isso pairece um problema de discussão. Se você estiview usando uma linha de background, então o segmento pode ser morto junto com qualquer timeout registrado. O fato de que ele funciona na próxima vez me diz que seu código funcionairá, se você fizer a chamada em um componente Android e gerenciair o WAKE_LOCK nele você mesmo. De qualquer forma, publique mais informações sobre o mecanismo de chamada?

    O problema pode estair no Apache HTTP Client. Veja HTTPCLIENT-1098 . Corrigido em 4.1.2.

    A exception de timeout tenta reviewter o DNS o IP, paira fins de logs. Isso leva um tempo adicional até que a exception seja efetivamente triggersda.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.