国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
教你寫(xiě)Android網(wǎng)絡(luò)框架之Request、Response類與請(qǐng)求隊(duì)列

  轉(zhuǎn)載請(qǐng)注明出處,本文來(lái)自【 Mr.Simple的博客 】

我正在參加博客之星,點(diǎn)擊這里投我一票吧,謝謝~   

前言

教你寫(xiě)Android網(wǎng)絡(luò)框架之基本架構(gòu)一文中我們已經(jīng)介紹了SimpleNet網(wǎng)絡(luò)框架的基本結(jié)構(gòu),今天我們就開(kāi)始從代碼的角度來(lái)開(kāi)始切入該網(wǎng)絡(luò)框架的實(shí)現(xiàn),在剖析的同時(shí)我們會(huì)分析設(shè)計(jì)思路,以及為什么要這樣做,這樣做的好處是什么。這樣我們不僅學(xué)到了如何實(shí)現(xiàn)網(wǎng)絡(luò)框架,也會(huì)學(xué)到設(shè)計(jì)一個(gè)通用的框架應(yīng)該有哪些考慮,這就擴(kuò)展到框架設(shè)計(jì)的范疇,通過(guò)這個(gè)簡(jiǎn)單的實(shí)例希望能給新人一些幫助。當(dāng)然這只是一家之言,大家都可以有自己的實(shí)現(xiàn)思路。

正如你所看到的,這系列博客是為新人準(zhǔn)備的,如果你是高手,請(qǐng)忽略。

在框架開(kāi)發(fā)當(dāng)中,很重要的一點(diǎn)就是抽象。也就是面向?qū)ο笾兄匾囊粭l原則: 依賴倒置原則,簡(jiǎn)單來(lái)說(shuō)就是要依賴抽象,而不依賴具體。這樣就使得我們的框架具有可擴(kuò)展性,同時(shí)也滿足了開(kāi)閉原則,即對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。針對(duì)于我們的網(wǎng)絡(luò)框架來(lái)說(shuō),最重要的抽象就是Reqeust類、Response類,因此今天我們就從兩個(gè)類開(kāi)始切入。最后我們?cè)僖刖W(wǎng)絡(luò)框架中的請(qǐng)求隊(duì)列(RequestQueue),這是SimpleNet中的中樞神經(jīng),所有的請(qǐng)求都需要放到該隊(duì)列,然后等待著被執(zhí)行。請(qǐng)求隊(duì)列就像工廠中的流水線一樣,而網(wǎng)絡(luò)請(qǐng)求就像流水線上的待加工的產(chǎn)品。執(zhí)行網(wǎng)絡(luò)請(qǐng)求的對(duì)象就類似工廠中的工人,在自己的崗位上等待流水線上傳遞過(guò)來(lái)的產(chǎn)品,然后對(duì)其加工,加工完就將產(chǎn)品放到其他的位置。它們角色對(duì)應(yīng)關(guān)系參考圖1,如對(duì)SimpleNet的一些角色不太清楚可參考教你寫(xiě)Android網(wǎng)絡(luò)框架之基本架構(gòu)一文。

圖1


Request類

既然網(wǎng)絡(luò)框架,那么我們先從網(wǎng)絡(luò)請(qǐng)求類開(kāi)始。前文已經(jīng)說(shuō)過(guò),既然是框架,那么就需要可擴(kuò)展性。因此注定了Request是抽象,而不是具體。而對(duì)于網(wǎng)絡(luò)請(qǐng)求來(lái)說(shuō),用戶得到的請(qǐng)求結(jié)果格式是不確定,比如有的服務(wù)器返回的是json,有的返回的是xml,有的直接是字符串。但是對(duì)于Http Response來(lái)說(shuō),它的返回?cái)?shù)據(jù)類型都是Stream,也就是我們得到的原始數(shù)據(jù)都是二進(jìn)制的流。所以在Request基類中我們必須預(yù)留方法來(lái)解析Response返回的具體類型,雖然返回的類型不同,但是他們的處理邏輯是一樣的,因此我們可把Request作為泛型類,它的泛型類型就是它的返回?cái)?shù)據(jù)類型,比如Request<String>,那么它的返回?cái)?shù)據(jù)類型就是String類型的。另外還有請(qǐng)求的優(yōu)先級(jí)、可取消等,我們這里先給出核心代碼,然后再繼續(xù)分析。

  1. /** 
  2.  * 網(wǎng)絡(luò)請(qǐng)求類. 注意GET和DELETE不能傳遞請(qǐng)求參數(shù),因?yàn)槠湔?qǐng)求的性質(zhì)所致,用戶可以將參數(shù)構(gòu)建到url后傳遞進(jìn)來(lái)到Request中. 
  3.  *  
  4.  * @author mrsimple 
  5.  * @param <T> T為請(qǐng)求返回的數(shù)據(jù)類型 
  6.  */  
  7. public abstract class Request<T> implements Comparable<Request<T>> {  
  8.   
  9.     /** 
  10.      * http請(qǐng)求方法枚舉,這里我們只有GET, POST, PUT, DELETE四種 
  11.      *  
  12.      * @author mrsimple 
  13.      */  
  14.     public static enum HttpMethod {  
  15.         GET("GET"),  
  16.         POST("POST"),  
  17.         PUT("PUT"),  
  18.         DELETE("DELETE");  
  19.   
  20.         /** http request type */  
  21.         private String mHttpMethod = "";  
  22.   
  23.         private HttpMethod(String method) {  
  24.             mHttpMethod = method;  
  25.         }  
  26.   
  27.         @Override  
  28.         public String toString() {  
  29.             return mHttpMethod;  
  30.         }  
  31.     }  
  32.   
  33.     /** 
  34.      * 優(yōu)先級(jí)枚舉 
  35.      *  
  36.      * @author mrsimple 
  37.      */  
  38.     public static enum Priority {  
  39.         LOW,  
  40.         NORMAL,  
  41.         HIGN,  
  42.         IMMEDIATE  
  43.     }  
  44.   
  45.     /** 
  46.      * Default encoding for POST or PUT parameters. See 
  47.      * {@link #getParamsEncoding()}. 
  48.      */  
  49.     private static final String DEFAULT_PARAMS_ENCODING = "UTF-8";  
  50.     /** 
  51.      * 請(qǐng)求序列號(hào) 
  52.      */  
  53.     protected int mSerialNum = 0;  
  54.     /** 
  55.      * 優(yōu)先級(jí)默認(rèn)設(shè)置為Normal 
  56.      */  
  57.     protected Priority mPriority = Priority.NORMAL;  
  58.     /** 
  59.      * 是否取消該請(qǐng)求 
  60.      */  
  61.     protected boolean isCancel = false;  
  62.   
  63.     /** 該請(qǐng)求是否應(yīng)該緩存 */  
  64.     private boolean mShouldCache = true;  
  65.     /** 
  66.      * 請(qǐng)求Listener 
  67.      */  
  68.     protected RequestListener<T> mRequestListener;  
  69.     /** 
  70.      * 請(qǐng)求的url 
  71.      */  
  72.     private String mUrl = "";  
  73.     /** 
  74.      * 請(qǐng)求的方法 
  75.      */  
  76.     HttpMethod mHttpMethod = HttpMethod.GET;  
  77.   
  78.     /** 
  79.      * 請(qǐng)求的header 
  80.      */  
  81.     private Map<String, String> mHeaders = new HashMap<String, String>();  
  82.     /** 
  83.      * 請(qǐng)求參數(shù) 
  84.      */  
  85.     private Map<String, String> mBodyParams = new HashMap<String, String>();  
  86.   
  87.     /** 
  88.      * @param method 
  89.      * @param url 
  90.      * @param listener 
  91.      */  
  92.     public Request(HttpMethod method, String url, RequestListener<T> listener) {  
  93.         mHttpMethod = method;  
  94.         mUrl = url;  
  95.         mRequestListener = listener;  
  96.     }  
  97.   
  98.     /** 
  99.      * 從原生的網(wǎng)絡(luò)請(qǐng)求中解析結(jié)果,子類覆寫(xiě) 
  100.      *  
  101.      * @param response 
  102.      * @return 
  103.      */  
  104.     public abstract T parseResponse(Response response);  
  105.   
  106.     /** 
  107.      * 處理Response,該方法運(yùn)行在UI線程. 
  108.      *  
  109.      * @param response 
  110.      */  
  111.     public final void deliveryResponse(Response response) {  
  112.         // 解析得到請(qǐng)求結(jié)果  
  113.         T result = parseResponse(response);  
  114.         if (mRequestListener != null) {  
  115.             int stCode = response != null ? response.getStatusCode() : -1;  
  116.             String msg = response != null ? response.getMessage() : "unkown error";  
  117.             mRequestListener.onComplete(stCode, result, msg);  
  118.         }  
  119.     }  
  120.   
  121.     public String getUrl() {  
  122.         return mUrl;  
  123.     }  
  124.   
  125.   
  126.   
  127.     public int getSerialNumber() {  
  128.         return mSerialNum;  
  129.     }  
  130.   
  131.     public void setSerialNumber(int mSerialNum) {  
  132.         this.mSerialNum = mSerialNum;  
  133.     }  
  134.   
  135.     public Priority getPriority() {  
  136.         return mPriority;  
  137.     }  
  138.   
  139.     public void setPriority(Priority mPriority) {  
  140.         this.mPriority = mPriority;  
  141.     }  
  142.   
  143.     protected String getParamsEncoding() {  
  144.         return DEFAULT_PARAMS_ENCODING;  
  145.     }  
  146.   
  147.     public String getBodyContentType() {  
  148.         return "application/x-www-form-urlencoded; charset=" + getParamsEncoding();  
  149.     }  
  150.   
  151.     public HttpMethod getHttpMethod() {  
  152.         return mHttpMethod;  
  153.     }  
  154.   
  155.     public Map<String, String> getHeaders() {  
  156.         return mHeaders;  
  157.     }  
  158.   
  159.     public Map<String, String> getParams() {  
  160.         return mBodyParams;  
  161.     }  
  162.   
  163.   
  164.     public void cancel() {  
  165.         isCancel = true;  
  166.     }  
  167.   
  168.     public boolean isCanceled() {  
  169.         return isCancel;  
  170.     }  
  171.   
  172.     /** 
  173.      * 返回POST或者PUT請(qǐng)求時(shí)的Body參數(shù)字節(jié)數(shù)組 
  174.      * 
  175.      */  
  176.     public byte[] getBody() {  
  177.         Map<String, String> params = getParams();  
  178.         if (params != null && params.size() > 0) {  
  179.             return encodeParameters(params, getParamsEncoding());  
  180.         }  
  181.         return null;  
  182.     }  
  183.   
  184.     /** 
  185.      * 將參數(shù)轉(zhuǎn)換為Url編碼的參數(shù)串 
  186.      */  
  187.     private byte[] encodeParameters(Map<String, String> params, String paramsEncoding) {  
  188.         StringBuilder encodedParams = new StringBuilder();  
  189.         try {  
  190.             for (Map.Entry<String, String> entry : params.entrySet()) {  
  191.                 encodedParams.append(URLEncoder.encode(entry.getKey(), paramsEncoding));  
  192.                 encodedParams.append('=');  
  193.                 encodedParams.append(URLEncoder.encode(entry.getValue(), paramsEncoding));  
  194.                 encodedParams.append('&');  
  195.             }  
  196.             return encodedParams.toString().getBytes(paramsEncoding);  
  197.         } catch (UnsupportedEncodingException uee) {  
  198.             throw new RuntimeException("Encoding not supported: " + paramsEncoding, uee);  
  199.         }  
  200.     }  
  201.   
  202.     // 用于對(duì)請(qǐng)求的排序處理,根據(jù)優(yōu)先級(jí)和加入到隊(duì)列的序號(hào)進(jìn)行排序  
  203.     @Override  
  204.     public int compareTo(Request<T> another) {  
  205.         Priority myPriority = this.getPriority();  
  206.         Priority anotherPriority = another.getPriority();  
  207.         // 如果優(yōu)先級(jí)相等,那么按照添加到隊(duì)列的序列號(hào)順序來(lái)執(zhí)行  
  208.         return myPriority.equals(another) ? this.getSerialNumber() - another.getSerialNumber()  
  209.                 : myPriority.ordinal() - anotherPriority.ordinal();  
  210.     }  
  211.   
  212.   
  213.   
  214.     /** 
  215.      * 網(wǎng)絡(luò)請(qǐng)求Listener,會(huì)被執(zhí)行在UI線程 
  216.      *  
  217.      * @author mrsimple 
  218.      * @param <T> 請(qǐng)求的response類型 
  219.      */  
  220.     public static interface RequestListener<T> {  
  221.         /** 
  222.          * 請(qǐng)求完成的回調(diào) 
  223.          *  
  224.          * @param response 
  225.          */  
  226.         public void onComplete(int stCode, T response, String errMsg);  
  227.     }  
  228. }  

上述代碼Request<T>為抽象類,T則為該請(qǐng)求Response的數(shù)據(jù)格式。這個(gè)T是請(qǐng)求類中的一個(gè)比較重要的點(diǎn),不同的人有不同的需求,即請(qǐng)求Reponse的數(shù)據(jù)格式并不是都是一樣的,我們必須考慮到請(qǐng)求返回類型的多樣性,用泛型T來(lái)表示返回的數(shù)據(jù)格式類型,然后Request子類覆寫(xiě)對(duì)應(yīng)的方法實(shí)現(xiàn)解析Response的數(shù)據(jù)格式,最后調(diào)用請(qǐng)求Listener將請(qǐng)求結(jié)果執(zhí)行在UI線程,這樣整個(gè)請(qǐng)求就完成了。

每個(gè)Request都有一個(gè)序列號(hào),該序列號(hào)由請(qǐng)求隊(duì)列生成,標(biāo)識(shí)該請(qǐng)求在隊(duì)列中的序號(hào),該序號(hào)和請(qǐng)求優(yōu)先級(jí)決定了該請(qǐng)求在隊(duì)列中的排序,即它在請(qǐng)求隊(duì)列的執(zhí)行順序。每個(gè)請(qǐng)求有請(qǐng)求方式,例如"POST"、"GET",這里我們用枚舉來(lái)代替,具名類型比單純的字符串更易于使用。每個(gè)Request都可以添加Header、Body參數(shù) ( 關(guān)于請(qǐng)求參數(shù)的格式可以參考 四種常見(jiàn)的 POST 提交數(shù)據(jù)方式),并且可以取消。抽象類封裝了通用的代碼,只有可變的部分是抽象函數(shù),這里只有parseResponse這個(gè)函數(shù)。

例如,我們返回的數(shù)據(jù)格式是Json,那么我們構(gòu)建一個(gè)子類叫做JsonRequest,示例代碼如下。

  1. /** 
  2.  * 返回的數(shù)據(jù)類型為Json的請(qǐng)求, Json對(duì)應(yīng)的對(duì)象類型為JSONObject 
  3.  *  
  4.  * @author mrsimple 
  5.  */  
  6. public class JsonRequest extends Request<JSONObject> {  
  7.   
  8.     public JsonRequest(HttpMethod method, String url, RequestListener<JSONObject> listener) {  
  9.         super(method, url, listener);  
  10.     }  
  11.   
  12.       
  13.     /** 
  14.      * 將Response的結(jié)果轉(zhuǎn)換為JSONObject 
  15.      */  
  16.     @Override  
  17.     public JSONObject parseResponse(Response response) {  
  18.         String jsonString = new String(response.getRawData());  
  19.         try {  
  20.             return new JSONObject(jsonString);  
  21.         } catch (JSONException e) {  
  22.             e.printStackTrace();  
  23.         }  
  24.         return null;  
  25.     }  
  26. }  

可以看到,實(shí)現(xiàn)一個(gè)請(qǐng)求類還是非常簡(jiǎn)單的,只需要覆寫(xiě)parseResponse函數(shù)來(lái)解析你的請(qǐng)求返回的數(shù)據(jù)即可。這樣就保證了可擴(kuò)展性,比如后面如果我想使用這個(gè)框架來(lái)做一個(gè)ImageLoader,那么我可以創(chuàng)建一個(gè)ImageRequest,該請(qǐng)求返回的類型就是Bitmap,那么我們只需要覆寫(xiě)parseResponse函數(shù),然后把結(jié)果轉(zhuǎn)換成Bitmap即可。

這里引入了Response類,這個(gè)Response類存儲(chǔ)了請(qǐng)求的狀態(tài)碼、請(qǐng)求結(jié)果等內(nèi)容,我們繼續(xù)往下看。

Response類

每個(gè)請(qǐng)求都對(duì)應(yīng)一個(gè)Response,但這里的問(wèn)題是這個(gè)Response的數(shù)據(jù)格式我們是不知道的。我們寫(xiě)的是框架,不是應(yīng)用??蚣苤皇菢?gòu)建一個(gè)基本環(huán)境,并且附帶一些比較常用的類,比如這里的JsonRequest。但是重要的一點(diǎn)是可以讓用戶自由、簡(jiǎn)單的擴(kuò)展以實(shí)現(xiàn)他的需求。對(duì)于Response類來(lái)說(shuō),我們最重要的一點(diǎn)就是要確定請(qǐng)求結(jié)果的數(shù)據(jù)格式類型。我們都知道,HTTP實(shí)際上是基于TCP協(xié)議,而TCP協(xié)議又是基于Socket,Socket實(shí)際上操作的也就是輸入、輸出流,輸出流是向服務(wù)器寫(xiě)數(shù)據(jù),輸入流自然是從服務(wù)器讀取數(shù)據(jù)。因此我們?cè)赗esponse類中應(yīng)該使用InputStream存儲(chǔ)結(jié)果或者使用更為易于使用的字節(jié)數(shù)組,這里我們使用字節(jié)數(shù)組來(lái)存儲(chǔ)。我們來(lái)看Response類。

  1. /** 
  2.  * 請(qǐng)求結(jié)果類,繼承自BasicHttpResponse,將結(jié)果存儲(chǔ)在rawData中. 
  3.  * @author mrsimple 
  4.  */  
  5. public class Response extends BasicHttpResponse {  
  6.   
  7.     public byte[] rawData = new byte[0];  
  8.   
  9.     public Response(StatusLine statusLine) {  
  10.         super(statusLine);  
  11.     }  
  12.   
  13.     public Response(ProtocolVersion ver, int code, String reason) {  
  14.         super(ver, code, reason);  
  15.     }  
  16.   
  17.     @Override  
  18.     public void setEntity(HttpEntity entity) {  
  19.         super.setEntity(entity);  
  20.         rawData = entityToBytes(getEntity());  
  21.     }  
  22.   
  23.     public byte[] getRawData() {  
  24.         return rawData;  
  25.     }  
  26.   
  27.     public int getStatusCode() {  
  28.         return getStatusLine().getStatusCode();  
  29.     }  
  30.   
  31.     public String getMessage() {  
  32.         return getStatusLine().getReasonPhrase();  
  33.     }  
  34.   
  35.     /** Reads the contents of HttpEntity into a byte[]. */  
  36.     private byte[] entityToBytes(HttpEntity entity) {  
  37.         try {  
  38.             return EntityUtils.toByteArray(entity);  
  39.         } catch (IOException e) {  
  40.             e.printStackTrace();  
  41.         }  
  42.         return new byte[0];  
  43.     }  
  44.   
  45. }  

這個(gè)類很簡(jiǎn)單,只是繼承了BasicHttpResponse,然后將輸入流轉(zhuǎn)換成字節(jié)數(shù)組,然后包裝了幾個(gè)常用的方法,主要是為了使用簡(jiǎn)單吧。我們將結(jié)果存儲(chǔ)為字節(jié)數(shù)組,這樣可以用戶可以很方便的將結(jié)果轉(zhuǎn)換為String、bitmap等數(shù)據(jù)類型,如果直接存儲(chǔ)的是InputStream,那么在很多時(shí)候用戶需要在外圍將InputStream先轉(zhuǎn)換為字節(jié)數(shù)組,然后再轉(zhuǎn)換為最終的格式,例如InputStream轉(zhuǎn)為String類型。這也是為什么我們這里選用byte[]而不用InputStream的原因。


請(qǐng)求隊(duì)列

網(wǎng)絡(luò)請(qǐng)求隊(duì)列也比較簡(jiǎn)單,實(shí)際上就是內(nèi)部封裝了一個(gè)優(yōu)先級(jí)隊(duì)列,在構(gòu)建隊(duì)列時(shí)會(huì)啟動(dòng)幾個(gè)NetworkExecutor ( 子線程 )來(lái)從請(qǐng)求隊(duì)列中獲取請(qǐng)求,并且執(zhí)行請(qǐng)求。請(qǐng)求隊(duì)列會(huì)根據(jù)請(qǐng)求的優(yōu)先級(jí)進(jìn)行排序,這樣就保證了一些優(yōu)先級(jí)高的請(qǐng)求得到盡快的處理,這也就是為什么Request類中實(shí)現(xiàn)了Comparable接口的原因。如果優(yōu)先級(jí)一致的情況下,則會(huì)根據(jù)請(qǐng)求加入到隊(duì)列的順序來(lái)排序,這個(gè)序號(hào)由請(qǐng)求隊(duì)列生成,這樣就保證了優(yōu)先級(jí)一樣的情況下按照FIFO的策略執(zhí)行。

  1. /** 
  2.  * 請(qǐng)求隊(duì)列, 使用優(yōu)先隊(duì)列,使得請(qǐng)求可以按照優(yōu)先級(jí)進(jìn)行處理. [ Thread Safe ] 
  3.  *  
  4.  * @author mrsimple 
  5.  */  
  6. public final class RequestQueue {  
  7.     /** 
  8.      * 請(qǐng)求隊(duì)列 [ Thread-safe ] 
  9.      */  
  10.     private BlockingQueue<Request<?>> mRequestQueue = new PriorityBlockingQueue<Request<?>>();  
  11.     /** 
  12.      * 請(qǐng)求的序列化生成器 
  13.      */  
  14.     private AtomicInteger mSerialNumGenerator = new AtomicInteger(0);  
  15.   
  16.     /** 
  17.      * 默認(rèn)的核心數(shù) 
  18.      */  
  19.     public static int DEFAULT_CORE_NUMS = Runtime.getRuntime().availableProcessors() + 1;  
  20.     /** 
  21.      * CPU核心數(shù) + 1個(gè)分發(fā)線程數(shù) 
  22.      */  
  23.     private int mDispatcherNums = DEFAULT_CORE_NUMS;  
  24.     /** 
  25.      * NetworkExecutor,執(zhí)行網(wǎng)絡(luò)請(qǐng)求的線程 
  26.      */  
  27.     private NetworkExecutor[] mDispatchers = null;  
  28.     /** 
  29.      * Http請(qǐng)求的真正執(zhí)行者 
  30.      */  
  31.     private HttpStack mHttpStack;  
  32.   
  33.     /** 
  34.      * @param coreNums 線程核心數(shù) 
  35.      */  
  36.     protected RequestQueue(int coreNums, HttpStack httpStack) {  
  37.         mDispatcherNums = coreNums;  
  38.         mHttpStack = httpStack != null ? httpStack : HttpStackFactory.createHttpStack();  
  39.     }  
  40.   
  41.     /** 
  42.      * 啟動(dòng)NetworkExecutor 
  43.      */  
  44.     private final void startNetworkExecutors() {  
  45.         mDispatchers = new NetworkExecutor[mDispatcherNums];  
  46.         for (int i = 0; i < mDispatcherNums; i++) {  
  47.             mDispatchers[i] = new NetworkExecutor(mRequestQueue, mHttpStack);  
  48.             mDispatchers[i].start();  
  49.         }  
  50.     }  
  51.   
  52.     public void start() {  
  53.         stop();  
  54.         startNetworkExecutors();  
  55.     }  
  56.   
  57.     /** 
  58.      * 停止NetworkExecutor 
  59.      */  
  60.     public void stop() {  
  61.         if (mDispatchers != null && mDispatchers.length > 0) {  
  62.             for (int i = 0; i < mDispatchers.length; i++) {  
  63.                 mDispatchers[i].quit();  
  64.             }  
  65.         }  
  66.     }  
  67.   
  68.     /** 
  69.      * 不能重復(fù)添加請(qǐng)求 
  70.      *  
  71.      * @param request 
  72.      */  
  73.     public void addRequest(Request<?> request) {  
  74.         if (!mRequestQueue.contains(request)) {  
  75.             request.setSerialNumber(this.generateSerialNumber());  
  76.             mRequestQueue.add(request);  
  77.         } else {  
  78.             Log.d("", "### 請(qǐng)求隊(duì)列中已經(jīng)含有");  
  79.         }  
  80.     }  
  81.   
  82.     public void clear() {  
  83.         mRequestQueue.clear();  
  84.     }  
  85.   
  86.     public BlockingQueue<Request<?>> getAllRequests() {  
  87.         return mRequestQueue;  
  88.     }  
  89.   
  90.     /** 
  91.      * 為每個(gè)請(qǐng)求生成一個(gè)系列號(hào) 
  92.      *  
  93.      * @return 序列號(hào) 
  94.      */  
  95.     private int generateSerialNumber() {  
  96.         return mSerialNumGenerator.incrementAndGet();  
  97.     }  
  98. }  

這里引入了一個(gè)HttpStack,這是一個(gè)接口,只有一個(gè)函數(shù)。該接口定義了執(zhí)行網(wǎng)絡(luò)請(qǐng)求的抽象,代碼如下:

  1. /** 
  2.  * 執(zhí)行網(wǎng)絡(luò)請(qǐng)求的接口 
  3.  *  
  4.  * @author mrsimple 
  5.  */  
  6. public interface HttpStack {  
  7.     /** 
  8.      * 執(zhí)行Http請(qǐng)求 
  9.      *  
  10.      * @param request 待執(zhí)行的請(qǐng)求 
  11.      * @return 
  12.      */  
  13.     public Response performRequest(Request<?> request);  
  14. }  

今天就先到這里吧,關(guān)于HttpStack、NetworkExecutor、ResponseDelivery的介紹將在下一篇博客中更新,敬請(qǐng)期待。

如果你看到這里都不給我投一篇,那簡(jiǎn)直太不夠意思了!!點(diǎn)擊這里投我一票吧,謝謝~   

Github地址

SimpleNet網(wǎng)絡(luò)框架地址

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
值得反復(fù)品味的面向?qū)ο罅笤瓌t
Volley 源碼解析
CookieUtils —— Cookie 工具類
Android網(wǎng)絡(luò)開(kāi)發(fā)庫(kù)Volley使用教程
教你寫(xiě)Android網(wǎng)絡(luò)框架之基本架構(gòu) | 開(kāi)發(fā)技術(shù)前線
Spring 3.1 MVC REST 支持之跨域訪問(wèn)(Cross
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服