Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android HTTP網絡請求的異步實現

Android HTTP網絡請求的異步實現

編輯:關於Android編程

前言

大家都知道網絡操作的響應時間是不定的,所有的網絡操作都應該放在一個異步操作中處理,而且為了模塊解耦,我們希望網絡操作由專門的類來處理。所有網絡數據發送,數據接收都有某幾個類來實現,外部其它模塊只要調用和處理回調函數即可。外部模塊和網絡模塊之間的調用關系可以用如下圖表示:

調用端只要創建Request對象,設置參數,發起請求,即可。最後結果通過回調函數返回。右邊的異步任務,HttpClient創建,參數解析,錯誤處理全部交給網絡處理模塊來完成。由此來看,這個網絡模塊其實是重復性很高的開發工作,為了避免重復造輪子,下面就給大家介紹下我們工作中實現的網絡操作模塊及相應類的實現。

1.調用端代碼:

Get或Post請求

protected void doWebTest()
 {
  String url = "http://www.target.com/abcd";

  try {
   MyHttpRequest http = new MyHttpRequest(url);
   //如果是Post請求,則設置.如果是get請求,請不要設置post參數
   //http.addPost("data", "testpostvalue");
   //post參數結束,get請求,不要添加上面addPost代碼
   http.addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
   http.addHeader("Accept-Encoding", "gzip, deflate, sdch");
   http.addHeader("Accept-Language","zh-CN,zh;q=0.8");
   http.addHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36");

   http.StartRequest(new INetResponseListener() {
    @Override
    public void OnRequestComplete(NetResponse result) {
     if(result.isSuccess())
     {
      String resultStr = result.resultStr;
      //resultStr就是網絡返回的數據
     }else
     {
      Exception ee = result.getException();
     }
    }
   });

  } catch (Exception e) {
   e.printStackTrace();
  }
 }

以上是調用端需要實現的源碼,是不是很少代碼就可以完成網絡請求?下面就為大家揭開這個網絡處理類的面紗。

2.主要類介紹
 1.AbstractRequester:一個抽象的網絡請求類
 2.MyHttpRequest::實例化的網絡請求類。如果開發者有其它特殊處理需求,可以繼承AbstractRequester 自己重新實現parseResponse
 3.HttpEngine:HttpClient網絡引擎類,最終的網絡請求由這個類處理
 4.HttpRequestData:傳遞給AsyncTask的參數類
 5.NetResponse:返回給調用者的響應類
 6.INetResponseListener:異步回調的interface

類之間的關系如下圖所示:

2.1 AbstractRequester
抽象的網絡管理類,類定義如下:

public abstract class AbstractRequester extends AsyncTask<HttpRequestData,Integer,NetResponse> {
 ...
 /**
  * 根據需求創建傳遞給http發送的參數
  * @return
  */
 abstract HttpRequestData createData();
 /**
  * 根據返回的流,解析生成相應的對象
  * @param in
  * @return
  */
 abstract NetResponse parseResponse(InputStream in);

 //執行完成後的回調函數 
 protected void onPostExecute(NetResponse result) {
  super.onPostExecute(result);
  if(listener!=null)
  {
   listener.OnRequestComplete(result);
  }
 }

 //網絡請求開始處理
 protected NetResponse doInBackground(HttpRequestData... reqArgs) {
  //因內容比較多。具體查看源碼
 }


 public void StartRequest(INetResponseListener aListener){
 //具體查看源碼
 }
}

對於一些有其它特殊需求的開發者,只需要繼承這個類,並實現它的抽象接口,如果是通用需求,則可以直接使用下面的MyHttpRequest類:

abstract HttpRequestData createData();
abstract NetResponse parseResponse(InputStream in);

2.2 MyHttpRequest
繼承並實現了AbstractRequester的網絡處理類,支持Get和Post類型,支持自定義添加headers參數。
對於普通的網絡請求和返回已經夠用,開發者可以直接使用。

2.3 HttpEngine
網絡請求引擎類。主要流程如下:
 1.創建createHttpClient
 2.判斷參數有效性
 3.判斷get或post
 4.創建對應的HttpGet或HttpPost
 5.設置各類參數
 6.調用httpClient.execute執行網絡請求
 7.解析和判斷網絡返回結果
 8.生成Stream對象並返回

2.4 HttpRequestData

傳遞給AsyncTask的參數類,用於設置http請求的各類參數。

2.5 NetResponse
返回給調用者的類對象,包括狀態、數據和異常。

2.6 INetResponseListener
定義很簡單,源碼如下:

public interface INetResponseListener {

 /**
  * 網絡請求返回
  * @param result
  */
 public void OnRequestComplete(NetResponse result);

}

調用者只要實現這個interface,異步接收返回結果即可,返回結果就是NetResponse對象。

 - 常見問題

1. AsyncTask說明
 大家都知道AsyncTask是異步的,所以網絡請求通過AsyncTask來實現,通過AyncTask的好處是輕量級異步,而且可以操作ui線程,比如更新進度條等。但AsyncTask也存在以下一些問題:
 •task需要在ui線程中創建和啟用,所以AbstractRequester 對象的創建和調用StartRequest請在ui線程中完成
 •API 11也就是3.0以後,AsyncTask是排隊執行,所以如果其中一個任務出現較耗時,其它網絡請求需要等待;如果你想同步執行,要修改execute為executeOnExecutor(但不推薦做這個修改)

2. 權限
在xml中添加網絡操作權限:

<uses-permission android:name="android.permission.INTERNET" />

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持本站。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved