CustomerHttpClient单例遇到的超时问题

来源:互联网 发布:淘宝店 转让 编辑:程序博客网 时间:2024/04/29 22:34

以前的项目中一直使用网上的一个用单例写的httpclient类,如下

public static synchronized HttpClient getHttpClient() {if (null == customerHttpClient) {HttpParams params = new BasicHttpParams();// 设置一些基本参数HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);HttpProtocolParams.setContentCharset(params, CHARSET);HttpProtocolParams.setUseExpectContinue(params, true);HttpProtocolParams.setUserAgent(params,"Mozilla/5.0(Linux;U;Android 2.2.1;en-us;Nexus One Build.FRG83) "+ "AppleWebKit/553.1(KHTML,like Gecko) Version/4.0 Mobile Safari/533.1");// 超时设置/* 从连接池中取连接的超时时间 */ConnManagerParams.setTimeout(params, 1000);     //1/* 连接超时 */HttpConnectionParams.setConnectionTimeout(params, 5000);//2,5/* 请求超时 */HttpConnectionParams.setSoTimeout(params, 5000);//4,5 // 设置我们的HttpClient支持HTTP和HTTPS两种模式SchemeRegistry schReg = new SchemeRegistry();schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));schReg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));// 使用线程安全的连接管理来创建HttpClientClientConnectionManager conMgr = new ThreadSafeClientConnManager(params, schReg);customerHttpClient = new DefaultHttpClient(conMgr, params); }return customerHttpClient;}
可经常出现数据读取超时的问题,打印的log信息是connect socket ****** timeout

经过上网查询和自己验证,发现在使用这个单例类的时候,如果开启3个以上的线程跑,就会经常出现超时的问题。

后来发现android sdk中自带了一个类AndroidHttpClient ,这个类很好的解决了我遇到的问题。

该类初始化很简单,如下:

 AndroidHttpClient httpClient = AndroidHttpClient.newInstance(TAG);  

可以写在application中作为全局联网工具来使用

退出时,记得

private void shutdownHttpClient(){      if (httpClient != null) {        if (httpClient.getConnectionManager() != null) {          httpClient.getConnectionManager().shutdown();        }        httpClient.close();        httpClient = null;      }    }  
当然,2.3以后,urlconnection是更好的选择。谷歌也推出了volley框架,简单易上手,小伙伴们赶紧来学吧。



0 0