Android 類Volley網絡請求框架結構簡單剖析

序言

咱們可能已經使用過Volley,固然如今最多得回事OkHttp,Volley的實現也是以前至關大的一部分網絡請求框架的大體實現方式。若是你已經飽讀各種網絡請求庫的源代碼,能夠移步了,這裏只是對於其大體面貌進行一個闡述,附帶上一些代碼的實現,具體的將會寫好以後貼出來。緩存

正題

  • Request安全

  • Response網絡

  • HttpStack框架

  • NetWorkExecutoride

  • ResponseDelivery函數

  • HttpStackFactoryoop

  • RequestQueue
    一個網絡請求框架,大體須要本身寫這些類,具體作什麼呢?post

  1. 要有一個Request類,若是是要寫框架,固然要將其聲明爲抽象類或接口,方便進一步擴展,其要實現的功能是對於底層的HttpUrlConnection或者HttpClient進行一個封裝,好比對於頭部和一些請求參數的設定,用戶能夠很方便的對其定製,而後將參數的設置細節進行一個隱藏,而後用戶能夠很方便的進行參數的傳遞,同時設置請求的回調,直接在UI線程處理結果,要藉助ResponseDelivery來實現。url

  2. 維護一個請求隊列,咱們的請求會有不少,這個時候,咱們須要維護一個線程安全的請求隊列,而後根據請求的優先級,來進行相應的操做。線程

  3. 請求隊列構建好了,那麼接下來須要的就是有執行者來進行執行這些操做了,顯然爲了提高速度,咱們須要經過線程池,線程池中的線程用來出列這些請求,若是出列請求呢?顯然,輪詢請求隊列便可,固然若是咱們設置了緩存,能夠先根據請求的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);
    }
  4. 返回的結果封裝在一個Response中,咱們能夠根據咱們的需求,對其作相應的解析。

  5. 結果傳遞,拿到了咱們的相應結果咱們如今處在線程池中,是沒法對於咱們的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);
        }
    }

感興趣的話,開始動手擼吧。。

相關文章
相關標籤/搜索