android學習二十四(網路編程的最佳實務)

來源:互聯網
上載者:User

標籤:網路編程   android   線程   回調機制   



 前面的部落格已經講解了HttpURLConnection和HttpClient的用法,知道了如何發起HTTP請求,以及解析伺服器返回
 的資料。但是可能你發現了,因為一個應用程式很多地方都可能使用網路功能,而發送HTTP請求的代碼基本相同,如果每次我們都去編寫一遍發送HTTP請求的代碼,這顯然不太好。
    通常情況下我們都應該將這些通用的網路操作提取到一個公用的類裡,並提供一個靜態方法,當想要發起網路請求的時候只需簡單地調用一下這個方法即可。比如下面的寫法:

package com.jack.networktest;import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;public class HttpUtil {public static String sendHttpRequest(String address){HttpURLConnection connection=null;try{URL url=new URL(address);connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("GET");connection.setConnectTimeout(8000);connection.setReadTimeout(8000);connection.setDoInput(true);connection.setDoOutput(true);InputStream in=connection.getInputStream();BufferedReader reader=new BufferedReader(new InputStreamReader(in));StringBuilder response=new StringBuilder();String line;while((line=reader.readLine())!=null){response.append(line);}return response.toString();}catch(Exception e){e.printStackTrace();return e.getMessage();}finally{if(connection!=null){connection.disconnect();}}}}


以後每當要發起一條HTTP請求的時候就可以這樣寫:
  String address="http://www.baidu.com";
  String response=HttpUtil.sendHttpRequest(address);


         在擷取到伺服器響應的資料後我們就可以對它進行解析和處理了。但是需要注意,網路請求通常都是屬於耗時操作,而 sendHttpRequest方法的內部並沒有開啟線程,這樣就可能導致在調用sendHttpRequest方法的時候使得主線程阻塞住。你可能說,在sendHttpRequest方法內部開啟一個線程不就解決了阻塞這個問題了嘛。其實沒那麼簡單,因為如果我們在sendHttpRequest方法中開啟了一個線程來發起HTTP請求,那麼伺服器響應的資料是無法進行返回的,所有的耗時邏輯都是在子線程裡進行的,sendHttpRequest方法會在伺服器還來得及響應的時候就執行結束了,當然也就無法返迴響應的資料了。
  那麼這種情況該如何解決?其實解決方案可以使用java的回調機制,下面就讓我們來學習一下回調機制到底如何使用的。
  首先需要定義一個介面,比如將它命名成HttpCallbackListener,代碼如下所示:
  public interfac HttpCallbackListener{
  void onFinish(String response);
  void onError(Exception e);
  }
  可以看到,我們在介面中定義了兩個方法,onFinish(String response)方法表示當伺服器成功響應我們請求
  的時候調用,onError(Exception e)表示當進行網路操作出現錯誤的時候調用。這兩個方法都帶有參數,
  onFinish(String response)方法中的參數代表著伺服器返回的資料,而onError(Exception e)方法
  中的參數記錄著錯誤的詳細資料。

       接著修改HttpUtil中的代碼:

import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;public class HttpUtil {public static void sendHttpRequest(final String address,final HttpCallbackListener listener){new Thread(new Runnable(){@Overridepublic void run() {// TODO Auto-generated method stubHttpURLConnection connection=null;try{URL url=new URL(address);connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("GET");connection.setConnectTimeout(8000);connection.setReadTimeout(8000);connection.setDoInput(true);connection.setDoOutput(true);InputStream in=connection.getInputStream();BufferedReader reader=new BufferedReader(new InputStreamReader(in));StringBuilder response=new StringBuilder();String line;while((line=reader.readLine())!=null){response.append(line);}if(listener!=null){//回調onFinish()方法listener.onFinish(response.toString());}}catch(Exception e){if(listener!=null){//回調onError()方法listener.onError(e);}}finally{if(connection!=null){connection.disconnect();}}}}).start();}}


我們首先給sendHttpRequest方法添加了一個HttpCallbackListener參數,並在方法的內部開啟了一個子線程,然後
在子線程裡去執行具體的網路操作。注意子線程中是無法通過return語句來返回資料的,因此這裡我們將伺服器響應的資料傳入了HttpCallbackListener的onFinish()方法中,如果出現了異常就將異常原因傳入到onError()方法中。
  現在sendHttpRequest方法接收兩個參數了,因此我們在調用它的時候還需要將HttpCallbackListener的執行個體傳入
  如下所示:

HttpUtil.sendHttpRequest(address,new HttpCallbackListener(){   public void onFinish(String response){   //在這雷根據返回內容執行具體的邏輯   }      public void onError(Exception e){      //在這裡對異常進行處理   }     });


這樣的話,當伺服器成功響應的時候我們就可以在onFinish方法裡對響應資料進行處理了,類似地,如果出現了異常,就可以在onError方法裡對異常情況進行處理。如此一來,我們就巧妙的利用回調機制將響應資料成功返回給調用方了。
  另外需要注意的是,onFinish方法和onError方法最終還是在子線程中啟動並執行,因此我們不可以在這裡執行任何的
  UI操作,如果需要根據返回的結果來更新UI,則仍然要使用非同步訊息處理機制。




http://blog.csdn.net/j903829182/article/details/42521437



android學習二十四(網路編程的最佳實務)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.