Volley源碼學(xué)習(xí)5-ExecutorDelivery類(lèi)

在NetworkDispatcher的run()方法中最后是由ExecutorDelivery對(duì)象將request 和response發(fā)送回主線程的。來(lái)看一看是怎么實(shí)現(xiàn)的。
ExecutorDelivery實(shí)現(xiàn)了ResponseDelivery 接口


package com.android.volley;

public interface ResponseDelivery {
    /**
     * Parses a response from the network or cache and delivers it.
     */
    void postResponse(Request<?> request, Response<?> response);

    /**
     * Parses a response from the network or cache and delivers it. The provided
     * Runnable will be executed after delivery.
     */
    void postResponse(Request<?> request, Response<?> response, Runnable runnable);

    /**
     * Posts an error for the given request.
     */
    void postError(Request<?> request, VolleyError error);
}

當(dāng)在NetworkDispatcher類(lèi)中執(zhí)行mDelivery.postResponse(request, response);方法時(shí),將request和response發(fā)送到ExecutorDelivery實(shí)現(xiàn)的postResponse(request, response)方法中。
ExecutorDelivery的構(gòu)造方法如下:

/**
     * Creates a new response delivery interface.
     * @param handler {@link Handler} to post responses on
     */
    public ExecutorDelivery(final Handler handler) {
        // Make an Executor that just wraps the handler.
        //匿名類(lèi)
        mResponsePoster = new Executor() {
            @Override
            public void execute(Runnable command) {       
                handler.post(command);
            }
        };
    }

其中handler 是在RequestQueue的構(gòu)造方法傳入的new ExecutorDelivery(new Handler(Looper.getMainLooper()));主線程的Handler。mResponsePoster 為Executor接口的匿名類(lèi)。查詢jdk得到此接口左右如下:

 /**
         * 此接口提供一種將任務(wù)提交與每個(gè)任務(wù)將如何運(yùn)行的機(jī)制(包括線程使用的細(xì)節(jié)、調(diào)度等)分離開(kāi)來(lái)的方法。
         * 通常使用 Executor 而不是顯式地創(chuàng)建線程。
         * 例如,可能會(huì)使用以下方法,而不是為一組任務(wù)中的每個(gè)任務(wù)調(diào)用 new Thread(new(RunnableTask())).start():
         */

意思就是不用為多個(gè)任務(wù)分別創(chuàng)建一個(gè)顯式的線程了。重寫(xiě)的ResponseDelivery 接口方法如下:

@Override
    public void postResponse(Request<?> request, Response<?> response) {
        postResponse(request, response, null);
    }

    @Override
    public void postResponse(Request<?> request, Response<?> response, Runnable runnable) {
        request.markDelivered();
        request.addMarker("post-response");
        mResponsePoster.execute(new ResponseDeliveryRunnable(request, response, runnable));
    }

    @Override
    public void postError(Request<?> request, VolleyError error) {
        request.addMarker("post-error");
        Response<?> response = Response.error(error);
        mResponsePoster.execute(new ResponseDeliveryRunnable(request, response, null));
    }

postResponse方法被調(diào)用時(shí),Executor的匿名類(lèi)mResponsePoster將執(zhí)行傳遞過(guò)來(lái)的 ResponseDeliveryRunnable對(duì)象,然后通過(guò)handler方法post回主線程。ResponseDeliveryRunnable實(shí)現(xiàn)了Runnable接口代碼如下:

 /**
     * A Runnable used for delivering network responses to a listener on the
     * main thread.
     */
    @SuppressWarnings("rawtypes")
    private class ResponseDeliveryRunnable implements Runnable {
        private final Request mRequest;
        private final Response mResponse;
        private final Runnable mRunnable;

        public ResponseDeliveryRunnable(Request request, Response response, Runnable runnable) {
            mRequest = request;
            mResponse = response;
            mRunnable = runnable;
        }

        @SuppressWarnings("unchecked")
        @Override
        public void run() {
            // If this request has canceled, finish it and don't deliver.
            if (mRequest.isCanceled()) {
                mRequest.finish("canceled-at-delivery");
                return;
            }         
            // Deliver a normal response or error, depending.
            if (mResponse.isSuccess()) {
                mRequest.deliverResponse(mResponse.result);
            } else {
                mRequest.deliverError(mResponse.error);
            }

            // If this is an intermediate response, add a marker, otherwise we're done
            // and the request can be finished.
            if (mResponse.intermediate) {
                mRequest.addMarker("intermediate-response");
            } else {
                mRequest.finish("done");
            }

            // If we have been provided a post-delivery runnable, run it.
            if (mRunnable != null) {
                mRunnable.run();
            }
       }
    }

Handler post的實(shí)現(xiàn)runnable對(duì)象將會(huì)執(zhí)行它,也就是會(huì)執(zhí)行其run()方法。run()方法中,通過(guò)Request的方法將Response傳遞回去。以上就是實(shí)現(xiàn)過(guò)程。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容