android 中http请求的容错管理

作者: Android火鸟来源: 博客园发布时间:2011-04-13 19:34阅读:1128 次 原文链接 [收藏]

在android项目中,如果有用到http请求,就必须也应该加上http请求的超时管理,异常管理,项目中遇到这个需求,google上搜索到了一大堆,但是写的都比较简单,做个demo还行,用在项目中还是不够完善。自己写了一个例子,有不完善之处,欢迎大家指正。

  需要注意的地方:有三个方面

  如何控制超时机制

  如何处理异常

  如何处理请求错误的

                                                                
                                                            private                                                                 class                                 XmlAsyncLoader                                 extends                                 XmlResourceRequest {

private boolean mIsCancle = false ;
private HttpGet mGet;
private HttpClient mHttp;

public XmlAsyncLoader(MxActivity <?> activity, String url)
throws MalformedURLException {
super (activity, url);
}

@Override
protected void doTaskInBackground() {
// 请求数据
if (mUrl.toLowerCase().startsWith( " http:// " )) {
mGet
= initHttpGet(mUrl);
mHttp
= initHttp();
try {
HttpResponse response
= mHttp.execute(mGet);
if (mIsCancle) {
return ;
}
if (response != null ) {
if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK){
onResponseError(
" network error " );
Log.v(TAG,
" the code is : " + response.getStatusLine().getStatusCode());
return ;
}
notifyUpdateProgress(
70 );
Document doc
= getDocumet(response);
Element root
= doc.getDocumentElement();
NodeList appList
= root
.getElementsByTagName(Item_ELEMENT_NAME);
final int len = appList.getLength();
if (len <= 0 ) { // 没有items
onFoundNoItems();
return ;
}
for ( int i = 0 ; i < len; i ++ ) {
Element item
= (Element) appList.item(i);
if (item.getNodeType() == Node.ELEMENT_NODE) {
HahaItemInfo info
= createHahaItemIno(item);
if (mIsCancle){
return ;
}
onFoundItem(info,
80 + 20 * (i + 1 ) / len);
addUrlToQueue(info.userIconUrl);
}
};

}
}
catch (ConnectTimeoutException e){
onResponseError(
" time out " );
}
catch (ClientProtocolException e) {
-- mCurrentPage;
e.printStackTrace();
}
catch (IOException e) {
-- mCurrentPage;
e.printStackTrace();
}
catch (XmlPullParserException e) {
-- mCurrentPage;
e.printStackTrace();
}
finally {
notifyLoadFinish();
notifyLoadImages();
mHttp.getConnectionManager().shutdown();
}

}
}


private HttpClient initHttp() {
HttpClient client
= new DefaultHttpClient();
client.getParams().setIntParameter(
HttpConnectionParams.SO_TIMEOUT, TIME_OUT_DELAY);
// 超时设置
client.getParams().setIntParameter(
HttpConnectionParams.CONNECTION_TIMEOUT, TIME_OUT_DELAY);
// 连接超时
return client;
}

private HttpGet initHttpGet(String mUrl) {
HttpGet get
= new HttpGet(mUrl);
initHeader(get);
return get;
}


@Override
public boolean tryCancel() {
Log.i(TAG,
" tryCanle is working " );
mGet.abort();
mIsCancle
= true ;
mHttp.getConnectionManager().shutdown();
notifyLoadFinish();
return true ;
}

}

这是一个异步任务类,发送get请求请求数据,解析服务器的响应数据,同时通知ui线程更新ui
在android中,互联网交互的写法有很多,可以使用apache提供的包,也可以使用google提供的api,我不知道那种更好,只是习惯于使用
apache的api。
1. 设置超时机制
                                      
                                                     client.getParams().setIntParameter(
HttpConnectionParams.SO_TIMEOUT, TIME_OUT_DELAY);
// 超时设置
client.getParams().setIntParameter(
HttpConnectionParams.CONNECTION_TIMEOUT, TIME_OUT_DELAY);
// 连接超时
这里设置了两种超时,第一种是请求超时,第二种时连接超时。
当向服务器发出请求后,请求和服务器建立socket连接,但是很长时间内都没有建立socket连接,这就时第一种请求超时,这种情况主要发生在请求了
一个不存在的服务器。超时之后,会抛出InterruptedIOException异常。
Timeout for blocking operations. The argument value is specified in milliseconds. An  InterruptedIOException is thrown if this timeout expires.
客户端已经与服务器建立了socket连接,但是服务器并没有处理客户端的请求,没有相应服务器,这就是第二种连接超时。这中超时会抛出
ConnectTimeoutException异常,ConnectTimeoutException继承自InterruptedIOException,所以只要捕获ConnectTimeoutException
就可以了。
2. 分析一下请求的过程
 2.1 HttpResponse response = mHttp.execute(mGet);
执行请求方法,获取服务器响应,(这里有个不太成熟的看法,response不可能为null,还有待验证)。
  2.2 获取请求响应码
                                    
                                                                                 if                            (response.getStatusLine().getStatusCode()                            !=                            HttpStatus.SC_OK){
onResponseError(
" network error " );
Log.v(TAG,
" the code is : " + response.getStatusLine().getStatusCode());
return ;
}

  即使连接上服务器,并且从服务器上获取了数据,也有可能时服务器返回的错误信息,因此也需要特殊处理。
2.3 异常处理
  对于异常,不能简单的捕获就完事,例如上面的代码中,我请求第三页的数据,如果发生异常,请求不成功,那么我就需要让当前页数回滚,
如果成功了就不用回滚了,所以需要对异常进行处理
2.4 finally关键字
  不管是请求成功,还是失败,都需要关闭链接。


更多相关文章

  1. [置顶] Android NDK开发 Android JNI项目创建
  2. Android开发实战-项目学习笔记(3)
  3. android中如何判断edittext中数据为空?
  4. Android之怎么使用SQLite数据库(增、删、改、查、分页等)以及Lis
  5. AndroidX介绍及项目迁移
  6. Android--创建和使用数据库详细指南
  7. Android adapter 数据适配器
  8. Android 4.1模拟器访问服务器接口

随机推荐

  1. Android方向传感器实践——自己动手做指
  2. Android系列教程之四:Android项目的目录结
  3. Android(安卓)高手进阶教程(十四)之----A
  4. Android通过软解码播放视频
  5. Android布局管理器 - 详细解析布局实现
  6. Android(安卓)以widget的方式集成Dcloud
  7. Android——UI篇:Android监听back按键动作
  8. Android获取音视频原始流数据方法详解
  9. Android(安卓)SystemUI (导入到Eclipse,
  10. Android和Java的区别