专栏名称: 安卓开发精选
伯乐在线旗下账号,分享安卓应用相关内容,包括:安卓应用开发、设计和动态等。
目录
相关文章推荐
开发者全社区  ·  19岁私奔裸婚,连生3胎 ·  15 小时前  
开发者全社区  ·  传最强人妻牛莉离婚 ·  昨天  
开发者全社区  ·  跳崖了 ·  昨天  
开发者全社区  ·  大S走了,两任老公争遗产式撕逼表演 ·  2 天前  
开发者全社区  ·  恒大歌舞团团长嫁人了 ·  2 天前  
51好读  ›  专栏  ›  安卓开发精选

Android 网络编程(4): 从源码解析Volley(下)

安卓开发精选  · 公众号  · android  · 2016-08-21 08:50

正文

(点击 上方公众号 ,可快速关注)


来源:刘望舒

链接:blog.csdn.net/itachi85/article/details/51104301


接上文


} catch ( InterruptedException var4 ) {

if ( this . mQuit ) {

return ;

}

}

}

}

}

}

}


static {

DEBUG = VolleyLog . DEBUG ;

}


看到四个while循环有些晕吧,让我们挑重点的说,首先从缓存队列取出请求,判断是否请求是否被取消了,如果没有则判断该请求是否有缓存的响应,如果有并且没有过期则对缓存响应进行解析并回调给主线程。接下来看看网络调度线程。


4.NetworkDispatcher网络调度线程


NetworkDispatcher的run()方法:


public void run () {

Process . setThreadPriority ( 10 );

while ( true ) {

long startTimeMs ;

Request request ;

while ( true ) {

startTimeMs = SystemClock . elapsedRealtime ();

try {

//从队列中取出请求

request = ( Request ) this . mQueue . take ();

break ;

} catch ( InterruptedException var6 ) {

if ( this . mQuit ) {

return ;

}

}

}

try {

request . addMarker ( "network-queue-take" );

if ( request . isCanceled ()) {

request . finish ( "network-discard-cancelled" );

} else {

this . addTrafficStatsTag ( request );

//请求网络

NetworkResponse e = this . mNetwork . performRequest ( request );

request . addMarker ( "network-http-complete" );

if ( e . notModified && request . hasHadResponseDelivered ()) {

request . finish ( "not-modified" );

} else {

Response volleyError1 = request . parseNetworkResponse ( e );

request . addMarker ( "network-parse-complete" );

if ( request . shouldCache () && volleyError1 . cacheEntry != null ) {

//将响应结果存入缓存

this . mCache . put ( request . getCacheKey (), volleyError1 . cacheEntry );

request . addMarker ( "network-cache-written" );

}

request . markDelivered ();

this . mDelivery . postResponse ( request , volleyError1 );

}

}

} catch ( VolleyError var7 ) {

var7 . setNetworkTimeMs ( SystemClock . elapsedRealtime () - startTimeMs );

this . parseAndDeliverNetworkError ( request , var7 );

} catch ( Exception var8 ) {

VolleyLog . e ( var8 , "Unhandled exception %s" , new Object []{ var8 . toString ()});

VolleyError volleyError = new VolleyError ( var8 );

volleyError . setNetworkTimeMs ( SystemClock . elapsedRealtime () - startTimeMs );

this . mDelivery . postError ( request , volleyError );

}

}

}


网络调度线程也是从队列中取出请求并且判断是否被取消了,如果没取消就去请求网络得到响应并回调给主线程。请求网络时调用this.mNetwork.performRequest(request),这个mNetwork是一个接口,实现它的类是BasicNetwork,我们来看看BasicNetwork的performRequest()方法:


public NetworkResponse performRequest ( Request ? > request ) throws VolleyError {

long requestStart = SystemClock . elapsedRealtime ();

while ( true ) {

HttpResponse httpResponse = null ;

Object responseContents = null ;

Map responseHeaders = Collections . emptyMap ();

try {

HashMap e = new HashMap ();

this . addCacheHeaders ( e , request . getCacheEntry ());

httpResponse = this . mHttpStack . performRequest ( request , e );

StatusLine statusCode1 = httpResponse . getStatusLine ();

int networkResponse1 = statusCode1 . getStatusCode ();

responseHeaders = convertHeaders ( httpResponse . getAllHeaders ());

if ( networkResponse1 == 304 ) {

Entry requestLifetime2 = request . getCacheEntry ();

if ( requestLifetime2 == null ) {

return new NetworkResponse ( 304 , ( byte []) null , responseHeaders , true , SystemClock . elapsedRealtime () - requestStart );

}

requestLifetime2 . responseHeaders . putAll ( responseHeaders );

return new NetworkResponse ( 304 , requestLifetime2 . data , requestLifetime2 . responseHeaders , true , SystemClock . elapsedRealtime () - requestStart );

}

... 省略


从上面可以看到在12行调用的是HttpStack的performRequest()方法请求网络,接下来根据不同的响应状态码来返回不同的NetworkResponse。另外HttpStack也是一个接口,实现它的两个类我们在前面已经提到了就是HurlStack和HttpClientStack。让我们再回到NetworkDispatcher,请求网络后,会将响应结果存在缓存中,如果响应结果成功则调用this.mDelivery.postResponse(request, volleyError1)来回调给主线程。来看看Delivery的postResponse()方法:


public void postResponse ( Request > request , Response > response , Runnable runnable ) {

request . markDelivered ();

request . addMarker ( "post-response" );

this . mResponsePoster . execute ( new ExecutorDelivery . ResponseDeliveryRunnable ( request , response , runnable ));

}


来看看ResponseDeliveryRunnable里面做了什么:


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 ) {

this . mRequest = request ;

this . mResponse = response ;

this . mRunnable = runnable ;

}

public void run () {

if ( this . mRequest . isCanceled ()) {

this . mRequest . finish ( "canceled-at-delivery" );

} else {

if ( this . mResponse . isSuccess ()) {

this . mRequest . deliverResponse ( this . mResponse . result );

} else {

this . mRequest . deliverError ( this . mResponse . error );

}

if ( this . mResponse . intermediate ) {

this . mRequest . addMarker ( "intermediate-response" );

} else {

this . mRequest . finish ( "done" );

}

if ( this . mRunnable != null )







请到「今天看啥」查看全文


推荐文章
开发者全社区  ·  19岁私奔裸婚,连生3胎
15 小时前
开发者全社区  ·  传最强人妻牛莉离婚
昨天
开发者全社区  ·  跳崖了
昨天
开发者全社区  ·  大S走了,两任老公争遗产式撕逼表演
2 天前
开发者全社区  ·  恒大歌舞团团长嫁人了
2 天前
悦读文摘  ·  一岁年龄,一岁心(年度好文)
8 年前
每日健康知识  ·  五种走路方式最伤腰腿,你需要知道!
8 年前
superhealth  ·  为什么一定要戴套?!
7 年前
金乡大蒜辣椒国际交易市场  ·  这些老照片,献给我们回不去的童年!
7 年前