在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ò)程。