您的位置:首页 > 理论基础 > 计算机网络

httpClient访问网络,httpclient.execute(httpGet)方法不执行问题

2016-01-20 13:10 501 查看
最近在维护项目过程中遇到了一个比较奇葩的问题,软件在别的手机上都是OK的,就是在HTC手机上的时候,会遇到软件没有完全退出,然后再次点击软件,进不去的问题

首先说一下这个Bug产生的原因,因为每次 我们软件进入的时候都去请求GuidePage,看看是否需要升级,如果需要升级的话就要去请求引导界面,然后设置给Viewpager。那么

问题就产生在请求网络的时候,Bug复现;1,如果系统完全退出,就是在点击退出应用的时候调用System.exit(0)这个方法的时候,第二次进入软件的时候是没有问题的;问题在

于,没有完全退出应用,适当的保留一些服务的时候,再次进入就会进不去。根据log日志,分析出问题产生的原因就是在访问引导界面接口的时候,httpclient的execute方法没有

执行,观察自己封装的访问网络框架,发现链接都已经释放,httpclient也释放了,还是没能解决问题。最后确定问题在于访问网络的线程阻塞了。长时间不能相应。设置的链接超

时当然也是没有用的。下面就来说一下我的解决方案吧

public static String sendGetCommand(Context context, String url,
String retDataType) {
String result = null;

url = url.replaceAll(" ", "%20");

try {
httpRequest = new HttpGet(url);

// if(url.toLowerCase().startsWith("https"))
{
if (httpClient == null) {
httpClient = HttpsSSLSocketFactory.createMyHttpClient(
CONNECT_TIMEOUT, SO_TIMEOUT);
}
}
/*
* else { 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.
* HttpConnectionParams.setConnectionTimeout(httpParameters,
* CONNECT_TIMEOUT); // Set the default socket timeout (SO_TIMEOUT)
* // in milliseconds which is the timeout for waiting for data.
* HttpConnectionParams.setSoTimeout(httpParameters, SO_TIMEOUT); if
* (httpClient == null) { httpClient = new
* DefaultHttpClient(httpParameters); } }
*/
if(httpClient != null){
Thread thread = new Thread(){
@Override
public void run() {
try {
response = httpClient.execute(httpRequest);
}catch(IllegalArgumentException ec){
response = null;
interrupted();
}
catch (ClientProtocolException e) {
response = null;
interrupted();
e.printStackTrace();
} catch (IOException e) {
response = null;
interrupted();
e.printStackTrace();
}
}
};
thread.start();

try {
Thread.sleep(1000*2);
if(response == null){
thread.interrupt();
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
int statusCode = response.getStatusLine().getStatusCode();
System.out.println(statusCode);

if (response.getStatusLine().getStatusCode() == 200) {
if (retDataType != null)
result = EntityUtils.toString(response.getEntity(),
retDataType);
else
result = EntityUtils.toString(response.getEntity(),
HTTP.UTF_8);
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
}finally{
httpClient.getConnectionManager().closeExpiredConnections();
}

return result;
}
在执行execute方法的时候,另外开启一个线程去执行,然后捕获异常,判断线程是否阻塞,然后让线程沉睡2秒钟,调用thread.interrupt();打断状态,这样就能解决这个bug了

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: