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