336

接続ステータスを確認するために、次の関数を作成しました。

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());
        ...

実行をテストするためにサーバーをシャットダウンすると、行で長時間待機します

HttpResponse response = httpClient.execute(method);

待ち時間が長すぎるのを避けるためにタイムアウトを設定する方法を知っている人はいますか?

ありがとう!

4

10 に答える 10

625

私の例では、2つのタイムアウトが設定されています。接続タイムアウトがスローjava.net.SocketTimeoutException: Socket is not connectedされ、ソケットタイムアウトが発生しますjava.net.SocketTimeoutException: The operation timed out

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);

既存のHTTPClient(DefaultHttpClientやAndroidHttpClientなど)のパラメーターを設定する場合は、関数setParams()を使用できます。

httpClient.setParams(httpParameters);
于 2009-10-14T09:39:11.340 に答える
13

クライアントで設定を行うには:

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

私はこれをJellyBeanで正常に使用しましたが、古いプラットフォームでも機能するはずです...。

HTH

于 2012-08-29T15:56:34.920 に答える
8

Jakarta のhttp クライアント ライブラリを使用している場合は、次のようなことができます。

        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);
于 2009-03-29T02:23:58.343 に答える
3

オプションは、Square のOkHttpクライアントを使用することです。

ライブラリの依存関係を追加する

build.gradle に、次の行を含めます。

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

x.x.x目的のライブラリ バージョンはどこにありますか。

クライアントを設定する

たとえば、タイムアウトを 60 秒に設定する場合は、次のようにします。

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

ps: minSdkVersion が 8 より大きい場合は、TimeUnit.MINUTES. したがって、次のように簡単に使用できます。

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

単位の詳細については、TimeUnitを参照してください。

于 2015-08-07T04:15:15.970 に答える
1

ちなみに、Httpclient-android-4.3.5でHttpClientインスタンスを作成できますが、うまくいきます。

 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();
于 2014-11-24T07:37:28.437 に答える
1

を使用している場合は、次のようHttpURLConnectionに呼び出しますsetConnectTimeout()

URL url = new URL(myurl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(CONNECT_TIMEOUT);
于 2014-09-04T22:50:35.627 に答える