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つの例を書いて、完備していないところがあって、みんなの指摘を歓迎します.
注意すべき点:三つの面がある
タイムアウトメカニズムの制御方法
例外の処理方法
リクエストエラーの処理方法

  
  
  
  

     
     
     
     
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   
         ,    ,       。