亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android HTTP網(wǎng)絡(luò)請(qǐng)求的異步實(shí)現(xiàn)

 更新時(shí)間:2016年07月20日 10:31:27   投稿:lijiao  
這篇文章主要介紹了Android HTTP網(wǎng)絡(luò)請(qǐng)求的異步實(shí)現(xiàn),感興趣的小伙伴們可以參考一下

前言

大家都知道網(wǎng)絡(luò)操作的響應(yīng)時(shí)間是不定的,所有的網(wǎng)絡(luò)操作都應(yīng)該放在一個(gè)異步操作中處理,而且為了模塊解耦,我們希望網(wǎng)絡(luò)操作由專(zhuān)門(mén)的類(lèi)來(lái)處理。所有網(wǎng)絡(luò)數(shù)據(jù)發(fā)送,數(shù)據(jù)接收都有某幾個(gè)類(lèi)來(lái)實(shí)現(xiàn),外部其它模塊只要調(diào)用和處理回調(diào)函數(shù)即可。外部模塊和網(wǎng)絡(luò)模塊之間的調(diào)用關(guān)系可以用如下圖表示:

調(diào)用端只要?jiǎng)?chuàng)建Request對(duì)象,設(shè)置參數(shù),發(fā)起請(qǐng)求,即可。最后結(jié)果通過(guò)回調(diào)函數(shù)返回。右邊的異步任務(wù),HttpClient創(chuàng)建,參數(shù)解析,錯(cuò)誤處理全部交給網(wǎng)絡(luò)處理模塊來(lái)完成。由此來(lái)看,這個(gè)網(wǎng)絡(luò)模塊其實(shí)是重復(fù)性很高的開(kāi)發(fā)工作,為了避免重復(fù)造輪子,下面就給大家介紹下我們工作中實(shí)現(xiàn)的網(wǎng)絡(luò)操作模塊及相應(yīng)類(lèi)的實(shí)現(xiàn)。

1.調(diào)用端代碼:

Get或Post請(qǐng)求

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

  try {
   MyHttpRequest http = new MyHttpRequest(url);
   //如果是Post請(qǐng)求,則設(shè)置.如果是get請(qǐng)求,請(qǐng)不要設(shè)置post參數(shù)
   //http.addPost("data", "testpostvalue");
   //post參數(shù)結(jié)束,get請(qǐng)求,不要添加上面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就是網(wǎng)絡(luò)返回的數(shù)據(jù)
     }else
     {
      Exception ee = result.getException();
     }
    }
   });

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

以上是調(diào)用端需要實(shí)現(xiàn)的源碼,是不是很少代碼就可以完成網(wǎng)絡(luò)請(qǐng)求?下面就為大家揭開(kāi)這個(gè)網(wǎng)絡(luò)處理類(lèi)的面紗。

2.主要類(lèi)介紹
 1.AbstractRequester:一個(gè)抽象的網(wǎng)絡(luò)請(qǐng)求類(lèi)
 2.MyHttpRequest::實(shí)例化的網(wǎng)絡(luò)請(qǐng)求類(lèi)。如果開(kāi)發(fā)者有其它特殊處理需求,可以繼承AbstractRequester 自己重新實(shí)現(xiàn)parseResponse
 3.HttpEngine:HttpClient網(wǎng)絡(luò)引擎類(lèi),最終的網(wǎng)絡(luò)請(qǐng)求由這個(gè)類(lèi)處理
 4.HttpRequestData:傳遞給AsyncTask的參數(shù)類(lèi)
 5.NetResponse:返回給調(diào)用者的響應(yīng)類(lèi)
 6.INetResponseListener:異步回調(diào)的interface

類(lèi)之間的關(guān)系如下圖所示:

2.1 AbstractRequester
抽象的網(wǎng)絡(luò)管理類(lèi),類(lèi)定義如下:

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

 //執(zhí)行完成后的回調(diào)函數(shù) 
 protected void onPostExecute(NetResponse result) {
  super.onPostExecute(result);
  if(listener!=null)
  {
   listener.OnRequestComplete(result);
  }
 }

 //網(wǎng)絡(luò)請(qǐng)求開(kāi)始處理
 protected NetResponse doInBackground(HttpRequestData... reqArgs) {
  //因內(nèi)容比較多。具體查看源碼
 }


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

對(duì)于一些有其它特殊需求的開(kāi)發(fā)者,只需要繼承這個(gè)類(lèi),并實(shí)現(xiàn)它的抽象接口,如果是通用需求,則可以直接使用下面的MyHttpRequest類(lèi):

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

2.2 MyHttpRequest
繼承并實(shí)現(xiàn)了AbstractRequester的網(wǎng)絡(luò)處理類(lèi),支持Get和Post類(lèi)型,支持自定義添加headers參數(shù)。
對(duì)于普通的網(wǎng)絡(luò)請(qǐng)求和返回已經(jīng)夠用,開(kāi)發(fā)者可以直接使用。

2.3 HttpEngine
網(wǎng)絡(luò)請(qǐng)求引擎類(lèi)。主要流程如下:
 1.創(chuàng)建createHttpClient
 2.判斷參數(shù)有效性
 3.判斷get或post
 4.創(chuàng)建對(duì)應(yīng)的HttpGet或HttpPost
 5.設(shè)置各類(lèi)參數(shù)
 6.調(diào)用httpClient.execute執(zhí)行網(wǎng)絡(luò)請(qǐng)求
 7.解析和判斷網(wǎng)絡(luò)返回結(jié)果
 8.生成Stream對(duì)象并返回

2.4 HttpRequestData

傳遞給AsyncTask的參數(shù)類(lèi),用于設(shè)置http請(qǐng)求的各類(lèi)參數(shù)。

2.5 NetResponse
返回給調(diào)用者的類(lèi)對(duì)象,包括狀態(tài)、數(shù)據(jù)和異常。

2.6 INetResponseListener
定義很簡(jiǎn)單,源碼如下:

public interface INetResponseListener {

 /**
  * 網(wǎng)絡(luò)請(qǐng)求返回
  * @param result
  */
 public void OnRequestComplete(NetResponse result);

}

調(diào)用者只要實(shí)現(xiàn)這個(gè)interface,異步接收返回結(jié)果即可,返回結(jié)果就是NetResponse對(duì)象。

 - 常見(jiàn)問(wèn)題

1. AsyncTask說(shuō)明
 大家都知道AsyncTask是異步的,所以網(wǎng)絡(luò)請(qǐng)求通過(guò)AsyncTask來(lái)實(shí)現(xiàn),通過(guò)AyncTask的好處是輕量級(jí)異步,而且可以操作ui線(xiàn)程,比如更新進(jìn)度條等。但AsyncTask也存在以下一些問(wèn)題:
 •task需要在ui線(xiàn)程中創(chuàng)建和啟用,所以AbstractRequester 對(duì)象的創(chuàng)建和調(diào)用StartRequest請(qǐng)?jiān)趗i線(xiàn)程中完成
 •API 11也就是3.0以后,AsyncTask是排隊(duì)執(zhí)行,所以如果其中一個(gè)任務(wù)出現(xiàn)較耗時(shí),其它網(wǎng)絡(luò)請(qǐng)求需要等待;如果你想同步執(zhí)行,要修改execute為executeOnExecutor(但不推薦做這個(gè)修改)

2. 權(quán)限
在xml中添加網(wǎng)絡(luò)操作權(quán)限:

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論