咱們可能已經使用過Volley,固然如今最多得回事OkHttp,Volley的實現也是以前至關大的一部分網絡請求框架的大體實現方式。若是你已經飽讀各種網絡請求庫的源代碼,能夠移步了,這裏只是對於其大體面貌進行一個闡述,附帶上一些代碼的實現,具體的將會寫好以後貼出來。緩存
Request安全
Response網絡
HttpStack框架
NetWorkExecutoride
ResponseDelivery函數
HttpStackFactoryoop
RequestQueue
一個網絡請求框架,大體須要本身寫這些類,具體作什麼呢?post
要有一個Request類,若是是要寫框架,固然要將其聲明爲抽象類或接口,方便進一步擴展,其要實現的功能是對於底層的HttpUrlConnection或者HttpClient進行一個封裝,好比對於頭部和一些請求參數的設定,用戶能夠很方便的對其定製,而後將參數的設置細節進行一個隱藏,而後用戶能夠很方便的進行參數的傳遞,同時設置請求的回調,直接在UI線程處理結果,要藉助ResponseDelivery來實現。url
維護一個請求隊列,咱們的請求會有不少,這個時候,咱們須要維護一個線程安全的請求隊列,而後根據請求的優先級,來進行相應的操做。線程
請求隊列構建好了,那麼接下來須要的就是有執行者來進行執行這些操做了,顯然爲了提高速度,咱們須要經過線程池,線程池中的線程用來出列這些請求,若是出列請求呢?顯然,輪詢請求隊列便可,固然若是咱們設置了緩存,能夠先根據請求的url在咱們的cache中進行一個查找,若是找不到的時候,能夠再發起網絡請求,獲得輪詢隊列這種的請求,具體的任務就要交給負責網絡請求的類去作了。這裏咱們經過一個Http棧,就是對於HttpClient和HttpUrlConnection的一個封裝,而後對咱們的請求進行一個解析,而後返回結果。
public void run(){ try { while(!isStop){ final Request<?> request = mRequestQueue.take(); if(request.isCanceled()){ continue; } Response response = null; if(isUseCache(request)){ response = mReqCache.get(request.getUrl()); }else{ response = mHttpStack.preformRequest(request); if(request.isShouldCache()&&isSuccess(response)){ mReqCache.put(request.getUrl(),response); } } mResponseDelivery.deliveryResponse(request,response); } }catch (InterruptedException e){ } }
public interface HttpStack { public Response preformRequest(Request<?> request); }
返回的結果封裝在一個Response中,咱們能夠根據咱們的需求,對其作相應的解析。
結果傳遞,拿到了咱們的相應結果咱們如今處在線程池中,是沒法對於咱們的UI線程進行相應的操做的,所以咱們須要將咱們的結果傳遞到主線程。經過咱們的本身實現ResponseDelivery,具體的實現就是獲得告終果後,咱們注入咱們的請求類和咱們的響應結果依賴,該類會得到當前主線程的Handler,而後實現一個runnable,調用Request的監聽器,通知將Response傳遞進去,而後讓Handler,post出這個Runnable,優雅實現,線程切換。
public class ResponseDelivery implements Executor { Handler mResponseHandler = new Handler(Looper.getMainLooper()); public void deliveryResponse(final Request<?> request,final Response response){ Runnable respRunnable = new Runnable() { @Override public void run() { request.deliveryResponse(response); } }; execute(respRunnable); } @Override public void execute(Runnable command) { mResponseHandler.post(command); }
Request類中用來傳遞的函數
public final void deliveryResponse(Response response){ T result = parseResponse(response); if(mRequestListener!=null){ int stCode = response!=null?response.getStatusCode():-1; String msg = response !=null?response.getMessage():"unkown error"; mRequestListener.onComplete(stCode,result,msg); } }
感興趣的話,開始動手擼吧。。