Androidタイムアウトメカニズム
携帯電話端末アプリケーションの応答により,当時の無線通信ネットワークの状況と大きく関連している.通信ネットワークは往々にして不安定で、遅延が長いという特徴がある.したがって、私たちのアプリケーションでは、ネットワークを要求するとき、タイムアウトメカニズムのアプリケーションが特に重要です.
タイムアウトメカニズムは主に次のとおりです.
1、HTTP要求タイムアウトメカニズム
2、Socket通信タイムアウトメカニズム
HTTP要求タイムアウトメカニズム
public static void main(String[] args){
long a=System.currentTimeMillis(); try{ URL myurl = new URL(“http://www.baidu.cn”); URLConnection myurlcon = myurl.openConnection(); myurlcon.setConnectTimeout(1000); myurlcon.setReadTimeout(1000); BufferedReader in = new BufferedReader(new InputStreamReader(myurlcon.getInputStream(),”UTF-8″)); String inputLine;
while ((inputLine = in.readLine()) != null){ System.out.println(inputLine); in.close(); System.out.println(System.currentTimeMillis()-a); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
}
タイムアウトすると次の例外が放出されます.
java.net.SocketTimeoutException: Read timed out at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.read(SocketInputStream.java:129) at java.io.BufferedInputStream.fill(BufferedInputStream.java:218) at java.io.BufferedInputStream.read1(BufferedInputStream.java:256) at java.io.BufferedInputStream.read(BufferedInputStream.java:313) at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:606) at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:554) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:940) at com.Test.main(Test.java:52)
ここにはもう一つの文章があります.
Androidプロジェクトでは、httpリクエストに役立つ場合は、httpリクエストのタイムアウト管理、異常管理、プロジェクトでこのニーズに遭遇する必要がありますが、googleでは検索がたくさんありますが、書くのは簡単で、demoを作るのはまあまあで、プロジェクトではまだ十分ではありません.自分で1つの例を書いて、完備していないところがあって、みんなの指摘を歓迎します.
注意すべき点:三つの面がある
タイムアウトメカニズムの制御方法
例外の処理方法
リクエストエラーの処理方法
タイムアウトメカニズムは主に次のとおりです.
1、HTTP要求タイムアウトメカニズム
2、Socket通信タイムアウトメカニズム
HTTP要求タイムアウトメカニズム
public static void main(String[] args){
long a=System.currentTimeMillis(); try{ URL myurl = new URL(“http://www.baidu.cn”); URLConnection myurlcon = myurl.openConnection(); myurlcon.setConnectTimeout(1000); myurlcon.setReadTimeout(1000); BufferedReader in = new BufferedReader(new InputStreamReader(myurlcon.getInputStream(),”UTF-8″)); String inputLine;
while ((inputLine = in.readLine()) != null){ System.out.println(inputLine); in.close(); System.out.println(System.currentTimeMillis()-a); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
}
タイムアウトすると次の例外が放出されます.
java.net.SocketTimeoutException: Read timed out at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.read(SocketInputStream.java:129) at java.io.BufferedInputStream.fill(BufferedInputStream.java:218) at java.io.BufferedInputStream.read1(BufferedInputStream.java:256) at java.io.BufferedInputStream.read(BufferedInputStream.java:313) at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:606) at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:554) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:940) at com.Test.main(Test.java:52)
ここにはもう一つの文章があります.
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
, , 。