咱们可能已经使用过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); } }
感兴趣的话,开始动手撸吧。。