【问题标题】:Android: How to set a HTTP connection timeout and react to it?Android:如何设置 HTTP 连接超时并对其做出反应?
【发布时间】:2012-07-24 20:14:32
【问题描述】:

我正在开发一个 Android 应用程序,该应用程序需要在启动时立即从网页中读取一行。我正在使用以下代码执行此操作:

try{
        URL url = new URL("http://www.example.com");
        HttpURLConnection con = (HttpURLConnection) url.openConnection();
        BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
        line = reader.readLine();
}
catch(Exception e){
        e.printStackTrace();
}

它工作正常,但有时连接或服务器速度很慢,应用程序冻结或崩溃。

我想设置 5 秒的超时时间,如果超时,我想向用户表示网络繁忙,让他稍后再试。

我尝试了 HttpURLConnection setConnectTimeout() 方法,但没有成功。

任何线索我可以如何做到这一点?谢谢正手。

【问题讨论】:

    标签: android http


    【解决方案1】:

    如果将ConnectionTimeout 设置为 5 秒,可能会更好的解决方案,捕获 SocketTimeoutException 并从那里显示 Toast。当您将 ConnectionTimeout 设置为某个值并且连接没有得到响应时,代码将抛出 SocketTimeoutException。在这里,您可以捕获它并调用处理程序以在 UI 中显示吐司。最后会关闭连接并释放内存。

    class MyHttpClient extends DefaultHttpClient {
        @Override
        protected ClientConnectionManager createClientConnectionManager() {
            registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
            registry.register(new Scheme("https", 
                mSSLSocketFactory != null 
                ? mSSLSocketFactory 
                : SSLSocketFactory.getSocketFactory(), 
                443));
    
        return new SingleClientConnManager(getParams(), registry);
    }
    
       MyHttpClient httpClient = new MyHttpClient();
    
        // set http params
        HttpParams params = httpClient.getParams();
        params.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, new Integer(30000));
        params.setParameter(CoreConnectionPNames.SO_TIMEOUT, new Integer(30000));
        httpClient.setParams(params);
    
        ....
        httpClient.execute(httpUriRequest) 
    

    【讨论】:

    • 好的,但我猜我需要在调用“HttpURLConnection con = (HttpURLConnection) url.openConnection();”之前设置超时线,对吧?因为我猜那条线实际上执行了连接?
    • @DanielS 询问更多是否有问题我会更新更多细节。
    • @Maxim.. 你对此有任何想法stackoverflow.com/questions/16996820/…
    【解决方案2】:

    考虑改用AndroidHttpClient 类,它有很好的预设超时,因此您无需执行任何操作。

    【讨论】:

      猜你喜欢
      • 2021-05-29
      • 1970-01-01
      • 2014-10-19
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 2016-03-14
      • 2021-05-23
      • 1970-01-01
      相关资源
      最近更新 更多