Android: AndroidHttpClient - 如何设置超时时间?

7

我按照kuester2000的回答的指示操作,但是我的超时设置似乎无法生效。

try
{
    int timeout = 3000;
    URL myURL = //some valid URL

    AndroidHttpClient = AndroidHttpClient.newInstance("name");
    HttpGet httpGet = new HttpGet(myURL.toExternalForm());

    HttpParams httpParams = new BasicHttpParams();
    HttpConnectionParams.setConnectionTimeout(httpParams, timeout);
    HttpConnectionParams.setSoTimeout(httpParams, timeout);

    HttpResponse response = httpClient.execute(httpGet);

    //...
}
catch (SocketTimeoutException e)
{
    e.printStackTrace();
}
catch (ConnectTimeoutException e)
{
    e.printStackTrace();
}
catch (IOException e)
{
    e.printStackTrace();
}
//...

然而,超时值并没有改变任何东西。
在我提供的答案中,它也说:
连接超时会抛出“java.net.SocketTimeoutException:Socket未连接”,套接字超时会抛出“java.net.SocketTimeoutException:操作超时”。
但是我两个都没有得到。相反,我得到了“org.apache.http.conn.ConnectTimeoutException:连接到…超时”。
那么有人可以帮我吗?问题在哪里?
5个回答

9

您没有使用httpParams参数,它们必须提供给HTTPClient。因此,它不会像这样工作。在您链接的答案中,顺序是正确的!尝试以下顺序:首先创建参数,然后将其提供给HTTPClient。

HttpParams httpParameters = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParameters, 5000);
HttpConnectionParams.setSoTimeout(httpParameters, 10000);

HttpClient client = new DefaultHttpClient(httpParameters);
HttpGet request = new HttpGet(url);

HttpResponse response = client.execute(request);

我刚刚意识到,多亏了你的回答,我忘记插入httpClient.setParams(httpParameters);,这是kuester2000建议的。然而,使用AndroidHttpClient时它不起作用。 您能否像您所做的那样使用AndroidHttpClient而不是HttpClient? - jellyfish
你真的需要AndroidHTTPClient的功能吗?否则,你可以简单地使用DefaultHTTPClient。 - theomega
其实,我并不真正知道它们之间的区别...这可能意味着“不是”,对吧? - jellyfish
是的,也许可以看看这个答案:https://dev59.com/2m435IYBdhLWcg3w6EqF - theomega
你必须做出选择:要么让 Android 选择默认值(包括超时),要么自己设置配置。如果你真的需要可配置的超时时间,那就选择 DefaultHTTPClient。 - theomega
显示剩余2条评论

6

我忘记在http请求中附加参数,但在我的示例中正确的做法是:

httpGet.setParams(httpParams);

在调用httpClient.execute(httpGet)之前需要执行这行代码。

我只是添加了那行代码,然后它就正常工作了。


5
在客户端本身上设置的另一个选项:
AndroidHttpClient client = AndroidHttpClient.newInstance("Client V/1.0");
HttpConnectionParams.setConnectionTimeout(this.client.getParams(), 3000);
HttpConnectionParams.setSoTimeout(this.client.getParams(), 5000);

这应该会导致这些特定参数被设置... 希望有所帮助。

我喜欢这个。这里有更详细的解释:http://www.intertech.com/Blog/Post/Android-DefaultHttpClientAndroidHttpClient-and-HttpParams.aspx - Sofi Software LLC

0

0
            try {
                HttpGet httpGet = new HttpGet("your_uri/test.json");

                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 = 5000;
                HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
                // Set the default socket timeout (SO_TIMEOUT)
                // in milliseconds which is the timeout for waiting for data.
                int timeoutSocket = 10000;
                HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);

                HttpClient httpclient = new DefaultHttpClient();

                httpGet.setParams(httpParameters);

                HttpResponse response = httpclient.execute(httpGet);

                HttpEntity entity = response.getEntity();

                BufferedReader br = null;

                if(entity != null) {
                    Log.i("read", "nube");

                    br = new BufferedReader(new InputStreamReader(entity.getContent()));

                } else {
                    Log.i("read", "local");

                    AssetManager am = getApplicationContext().getAssets();
                    InputStream is = am.open("test.json");

                    br = new BufferedReader(new InputStreamReader(is));
                }

                String line;
                String texto = "";

                while ((line = br.readLine()) != null) {
                    texto += line;
                }


            } catch (IOException e) {
                e.printStackTrace();
            }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接