Androidにおけるhttpリクエストのフォールトトレランス管理


Androidにおけるhttpリクエストのフォールトトレランス管理
作者:Android火鸟来源:博客园发布时间:2011-04-13 19:34阅读:1128次原文链接[收藏]
Androidプロジェクトでは、httpリクエストに役立つ場合は、httpリクエストのタイムアウト管理、異常管理、プロジェクトでこのニーズに遭遇する必要があります.googleでは検索がたくさんありますが、書くのは簡単です.demoを作るのはまあまあです.プロジェクトではまだ十分ではありません.自分で1つの例を書いて、完備していないところがあって、みんなの指摘を歓迎します.
注意すべき点:三つの面がある
タイムアウトメカニズムの制御方法
例外の処理方法
リクエストエラーの処理方法

    
    
    
    

       
       
       
       
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);
//
ここでは2つのタイムアウトが されています.1つ はリクエストタイムアウト、2つ は タイムアウトです.
          ,        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   
         ,    ,       。