2

我正在开发一个 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() 方法,但没有成功。

有什么线索我可以做到这一点吗?谢谢正手。

4

2 回答 2

3

如果您将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) 
于 2012-07-24T20:22:03.787 回答
1

考虑改用AndroidHttpClient类,它有很好的预设超时,所以你不必做任何事情。

于 2012-07-24T20:45:12.533 回答