Jak nastavit prodlevu HttpResponse pro Android v Javě

hlasů
315

Vytvořil jsem následující funkce pro kontrolu stavu připojení:

private void checkConnectionStatus() {
    HttpClient httpClient = new DefaultHttpClient();

    try {
      String url = http://xxx.xxx.xxx.xxx:8000/GaitLink/
                   + strSessionString + /ConnectionStatus;
      Log.d(phobos, performing get  + url);
      HttpGet method = new HttpGet(new URI(url));
      HttpResponse response = httpClient.execute(method);

      if (response != null) {
        String result = getResponse(response.getEntity());
        ...

Když jsem vypnout server pro testování popravu čeká dlouhou dobu na lince

HttpResponse response = httpClient.execute(method);

Ví někdo, jak nastavit časový limit, aby se předešlo čekání příliš dlouhé?

Dík!

Položena 29/03/2009 v 04:15
zdroj uživatelem
V jiných jazycích...                            


10 odpovědí

hlasů
614

V mém příkladu jsou dva časové limity. Časový limit připojení hází „java.net.SocketTimeoutException: Socket není připojen“ a socket timeout „java.net.SocketTimeoutException: operace vypršel“.

HttpGet httpGet = new HttpGet(url);
HttpParams httpParameters = new BasicHttpParams();
// Set the timeout in milliseconds until a connection is established.
// The default value is zero, that means the timeout is not used. 
int timeoutConnection = 3000;
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
// Set the default socket timeout (SO_TIMEOUT) 
// in milliseconds which is the timeout for waiting for data.
int timeoutSocket = 5000;
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);

DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
HttpResponse response = httpClient.execute(httpGet);

Chcete-li nastavit parametry existující HTTPClient (např DefaultHttpClient nebo AndroidHttpClient) můžete použít funkci setParams () .

httpClient.setParams(httpParameters);
Odpovězeno 14/10/2009 v 10:39
zdroj uživatelem

hlasů
14

Chcete-li nastavení na straně klienta:

AndroidHttpClient client = AndroidHttpClient.newInstance("Awesome User Agent V/1.0");
HttpConnectionParams.setConnectionTimeout(client.getParams(), 3000);
HttpConnectionParams.setSoTimeout(client.getParams(), 5000);

Já jsem to úspěšně použita na Jellybean, ale měla by také pracovat pro starší platformy ....

HTH

Odpovězeno 29/08/2012 v 16:56
zdroj uživatelem

hlasů
9

Pokud váš používáte Jakarty http knihovny klienta pak můžete udělat něco jako:

        HttpClient client = new HttpClient();
        client.getParams().setParameter(HttpClientParams.CONNECTION_MANAGER_TIMEOUT, new Long(5000));
        client.getParams().setParameter(HttpClientParams.SO_TIMEOUT, new Integer(5000));
        GetMethod method = new GetMethod("http://www.yoururl.com");
        method.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, new Integer(5000));
        method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
        int statuscode = client.executeMethod(method);
Odpovězeno 29/03/2009 v 04:23
zdroj uživatelem

hlasů
6

Pokud používáte http klienta výchozí, tady je návod, jak to udělat s použitím výchozí http params:

HttpClient client = new DefaultHttpClient();
HttpParams params = client.getParams();
HttpConnectionParams.setConnectionTimeout(params, 3000);
HttpConnectionParams.setSoTimeout(params, 3000);

Původní zásluhu na http://www.jayway.com/2009/03/17/configuring-timeout-with-apache-httpclient-40/

Odpovězeno 15/01/2015 v 02:57
zdroj uživatelem

hlasů
4

Pro ty, kteří říkají, že je odpověď @ kuester2000 nefunguje, prosím, uvědomte si, že HTTP požadavků, nejprve pokusit najít hostitele IP s DNS požadavku a pak dělá skutečný požadavek HTTP na server, takže budete možná muset nastavit Časový limit pro požadavek DNS.

Pokud váš kód pracuje, aniž by časový limit pro požadavek DNS, že je to proto, že jste schopni dosáhnout DNS server, nebo jste bít Android DNS cache. Mimochodem, můžete vymazat cache restartováním zařízení.

Tento kód rozšiřuje původní odpověď obsahovat ruční vyhledávání DNS s vlastní časový limit:

//Our objective
String sURL = "http://www.google.com/";
int DNSTimeout = 1000;
int HTTPTimeout = 2000;

//Get the IP of the Host
URL url= null;
try {
     url = ResolveHostIP(sURL,DNSTimeout);
} catch (MalformedURLException e) {
    Log.d("INFO",e.getMessage());
}

if(url==null){
    //the DNS lookup timed out or failed.
}

//Build the request parameters
HttpParams params = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(params, HTTPTimeout);
HttpConnectionParams.setSoTimeout(params, HTTPTimeout);

DefaultHttpClient client = new DefaultHttpClient(params);

HttpResponse httpResponse;
String text;
try {
    //Execute the request (here it blocks the execution until finished or a timeout)
    httpResponse = client.execute(new HttpGet(url.toString()));
} catch (IOException e) {
    //If you hit this probably the connection timed out
    Log.d("INFO",e.getMessage());
}

//If you get here everything went OK so check response code, body or whatever

Použité metody:

//Run the DNS lookup manually to be able to time it out.
public static URL ResolveHostIP (String sURL, int timeout) throws MalformedURLException {
    URL url= new URL(sURL);
    //Resolve the host IP on a new thread
    DNSResolver dnsRes = new DNSResolver(url.getHost());
    Thread t = new Thread(dnsRes);
    t.start();
    //Join the thread for some time
    try {
        t.join(timeout);
    } catch (InterruptedException e) {
        Log.d("DEBUG", "DNS lookup interrupted");
        return null;
    }

    //get the IP of the host
    InetAddress inetAddr = dnsRes.get();
    if(inetAddr==null) {
        Log.d("DEBUG", "DNS timed out.");
        return null;
    }

    //rebuild the URL with the IP and return it
    Log.d("DEBUG", "DNS solved.");
    return new URL(url.getProtocol(),inetAddr.getHostAddress(),url.getPort(),url.getFile());
}   

Tato třída je z tohoto blogu . Jdi a zkontrolovat poznámky, pokud jej budete používat.

public static class DNSResolver implements Runnable {
    private String domain;
    private InetAddress inetAddr;

    public DNSResolver(String domain) {
        this.domain = domain;
    }

    public void run() {
        try {
            InetAddress addr = InetAddress.getByName(domain);
            set(addr);
        } catch (UnknownHostException e) {
        }
    }

    public synchronized void set(InetAddress inetAddr) {
        this.inetAddr = inetAddr;
    }
    public synchronized InetAddress get() {
        return inetAddr;
    }
}
Odpovězeno 26/07/2015 v 23:54
zdroj uživatelem

hlasů
2
HttpParams httpParameters = new BasicHttpParams();
            HttpProtocolParams.setVersion(httpParameters, HttpVersion.HTTP_1_1);
            HttpProtocolParams.setContentCharset(httpParameters,
                    HTTP.DEFAULT_CONTENT_CHARSET);
            HttpProtocolParams.setUseExpectContinue(httpParameters, true);

            // Set the timeout in milliseconds until a connection is
            // established.
            // The default value is zero, that means the timeout is not used.
            int timeoutConnection = 35 * 1000;
            HttpConnectionParams.setConnectionTimeout(httpParameters,
                    timeoutConnection);
            // Set the default socket timeout (SO_TIMEOUT)
            // in milliseconds which is the timeout for waiting for data.
            int timeoutSocket = 30 * 1000;
            HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
Odpovězeno 03/07/2014 v 13:38
zdroj uživatelem

hlasů
1

Jednou z možností je použít OkHttp klienta od náměstí.

Přidat závislost knihovny

V build.gradle, tento řádek:

compile 'com.squareup.okhttp:okhttp:x.x.x'

Tam, kde x.x.xje požadovaná verze knihovny.

Nastavit klienta

Například pokud chcete nastavit časový limit 60 sekund, proveďte tímto způsobem:

final OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.setReadTimeout(60, TimeUnit.SECONDS);
okHttpClient.setConnectTimeout(60, TimeUnit.SECONDS);

ps: Pokud parametr versionCode je větší než 8, můžete použít TimeUnit.MINUTES. Ano, můžete jednoduše použít:

okHttpClient.setReadTimeout(1, TimeUnit.MINUTES);
okHttpClient.setConnectTimeout(1, TimeUnit.MINUTES);

Pro více informací o jednotkách, viz TIMEUNIT .

Odpovězeno 07/08/2015 v 04:15
zdroj uživatelem

hlasů
1

můžete vyzvořit HttpClient instance mimochodem s Httpclient-android-4.3.5, může dobře fungovat.

 SSLContext sslContext = SSLContexts.createSystemDefault();
        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
                sslContext,
                SSLConnectionSocketFactory.STRICT_HOSTNAME_VERIFIER);
                RequestConfig.Builder requestConfigBuilder = RequestConfig.custom().setCircularRedirectsAllowed(false).setConnectionRequestTimeout(30*1000).setConnectTimeout(30 * 1000).setMaxRedirects(10).setSocketTimeout(60 * 1000);
        CloseableHttpClient hc = HttpClients.custom().setSSLSocketFactory(sslsf).setDefaultRequestConfig(requestConfigBuilder.build()).build();
Odpovězeno 24/11/2014 v 07:37
zdroj uživatelem

hlasů
1

Máte-li používáte HttpURLConnection, obraťte se setConnectTimeout(), jak je popsáno zde :

URL url = new URL(myurl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(CONNECT_TIMEOUT);
Odpovězeno 04/09/2014 v 23:50
zdroj uživatelem

hlasů
0
public boolean isInternetWorking(){
    try {
        int timeOut = 5000;
        Socket socket = new Socket();
        SocketAddress socketAddress = new InetSocketAddress("8.8.8.8",53);
        socket.connect(socketAddress,timeOut);
        socket.close();
        return true;
    } catch (IOException e) {
        //silent
    }
    return false;
}
Odpovězeno 27/02/2018 v 06:28
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more