日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

解析Android框架之Volley源碼

瀏覽:77日期:2022-09-18 11:08:11
目錄Volley簡單使用Volley執行原理Volley簡單使用

我這里是以依賴架包的形式 ,大家也可以以gradle的形式進行依賴。

解析Android框架之Volley源碼

好了,接下來上代碼了.....

//獲取volley的請求對象RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());StringRequest stringRequest = new StringRequest(StringRequest.Method.GET, 'http://www.baidu.com', new Response.Listener<String>() { @Override public void onResponse(String s) {Log.d('MainActivity', '----->' + s); }}, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) {Log.d('MainActivity', '---volleyError-->' + volleyError); }});requestQueue.add(stringRequest);

從代碼可以看出,首先newRequestQueue來獲取到一個請求隊列,然后在將StringRequest這個請求添加到請求隊列中,就可以了,就是這么簡單。當然請求不值StringRequest,還有JsonObjectRequest ,ImageRequest等等但是用法都是一樣的,這里就不貼代碼了。Volley的簡單使用就這樣可以進行請求了。是不是很簡單

Volley執行原理

但是這個不是本篇的重點,重點是分析一下這些是怎么執行的。先上一張圖

解析Android框架之Volley源碼

我們先看看newRequestQueue這個內部是怎么執行的,代碼一開始連續執行了幾個重載方法,最后走到newRequestQueue

public static RequestQueue newRequestQueue(Context context, HttpStack stack, int maxDiskCacheBytes) { File cacheDir = new File(context.getCacheDir(), 'volley'); String userAgent = 'volley/0'; try {String packageName = context.getPackageName();PackageInfo info = context.getPackageManager().getPackageInfo(packageName, 0);userAgent = packageName + '/' + info.versionCode; } catch (NameNotFoundException var7) {; } //這里進行了一個版本的判斷 2.3之前用的是HTTPClient,2.3之后使用的是HttpURLConnection if (stack == null) {if (VERSION.SDK_INT >= 9) { stack = new HurlStack();} else { stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent));} } Network network = new BasicNetwork((HttpStack)stack); RequestQueue queue; if (maxDiskCacheBytes <= -1) {queue = new RequestQueue(new DiskBasedCache(cacheDir), network); } else {queue = new RequestQueue(new DiskBasedCache(cacheDir, maxDiskCacheBytes), network); } queue.start(); return queue;}

在這里,我們看到了一個版本判斷,是不是瞬間感覺有點熟悉,沒錯,我們前面說的,volley2.3之前用的是HTTPClient,2.3之后使用的是HttpURLConnection就是在這里進行判斷的。接著看queue.start();

public void start() {this.stop();this.mCacheDispatcher = new CacheDispatcher(this.mCacheQueue, this.mNetworkQueue, this.mCache, this.mDelivery);this.mCacheDispatcher.start();for(int i = 0; i < this.mDispatchers.length; ++i) { NetworkDispatcher networkDispatcher = new NetworkDispatcher(this.mNetworkQueue, this.mNetwork, this.mCache, this.mDelivery); this.mDispatchers[i] = networkDispatcher; networkDispatcher.start();} }

mCacheDispatcher是緩存調度線程,NetworkDispatcher是網絡調度線程,而這個this.mDispatchers.length系統默認的大小為4,也就是說,在這里總共啟動了5個線程在后臺運行。

好了,到這里,就可以了,看源碼不要每一行都弄懂,不然,出不來了。到這里就拿到了這個RequestQueue對象。回過頭來看前面使用的代碼

//獲取volley的請求對象RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());StringRequest stringRequest = new StringRequest(StringRequest.Method.GET, 'http://www.baidu.com', new Response.Listener<String>() { @Override public void onResponse(String s) {Log.d('MainActivity', '----->' + s); }}, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) {Log.d('MainActivity', '---volleyError-->' + volleyError); }});requestQueue.add(stringRequest);

我們拿到這個RequestQueue對象以后,然后就把這個請求通過add方法添加到隊列中,我們看看這個add()方法是怎么執行的。

public <T> Request<T> add(Request<T> request) {request.setRequestQueue(this);Set var2 = this.mCurrentRequests;synchronized(this.mCurrentRequests) { this.mCurrentRequests.add(request);}request.setSequence(this.getSequenceNumber());request.addMarker('add-to-queue');if (!request.shouldCache()) { //如果不能緩存 this.mNetworkQueue.add(request); return request;} else { Map var7 = this.mWaitingRequests; synchronized(this.mWaitingRequests) {String cacheKey = request.getCacheKey();if (this.mWaitingRequests.containsKey(cacheKey)) { //判斷之前是否執行過,但是還沒有返回結果 Queue<Request<?>> stagedRequests = (Queue)this.mWaitingRequests.get(cacheKey); if (stagedRequests == null) {stagedRequests = new LinkedList(); } ((Queue)stagedRequests).add(request); this.mWaitingRequests.put(cacheKey, stagedRequests); if (VolleyLog.DEBUG) {VolleyLog.v('Request for cacheKey=%s is in flight, putting on hold.', new Object[]{cacheKey}); }} else {//沒有的話就將請求加入緩存隊列mCacheQueue,同時加入mWaitingRequests中用來做下次同樣請求來時的重復判斷依據 this.mWaitingRequests.put(cacheKey, (Object)null); this.mCacheQueue.add(request);}return request; }} }

從代碼中可以看出,首先判斷是否可以緩存,當然,默認是可以緩存的。如果不能緩存的話,則通過this.mNetworkQueue.add(request);將請求添加到網絡請求隊列中。如果可以緩存,則還會判斷一次這個請求是否請求,如果執行過就就通過this.mWaitingRequests.put(cacheKey, stagedRequests);添加到mWaitingRequests隊列,不在重復請求。否則就加入到緩存隊列。

大體的流程是這樣。現在我們看看緩存的,和網絡的是怎么執行的。我們找到start()方法

public void start() {this.stop();this.mCacheDispatcher = new CacheDispatcher(this.mCacheQueue, this.mNetworkQueue, this.mCache, this.mDelivery);this.mCacheDispatcher.start();for(int i = 0; i < this.mDispatchers.length; ++i) { NetworkDispatcher networkDispatcher = new NetworkDispatcher(this.mNetworkQueue, this.mNetwork, this.mCache, this.mDelivery); this.mDispatchers[i] = networkDispatcher; networkDispatcher.start();} }

先看CacheDispatcher,找到run()方法

public void run() {if (DEBUG) { VolleyLog.v('start new dispatcher', new Object[0]);}Process.setThreadPriority(10);this.mCache.initialize();while(true) { while(true) {while(true) { while(true) {try { while(true) {final Request<?> request = (Request)this.mCacheQueue.take(); //從緩存隊列中獲取到一個請求request.addMarker('cache-queue-take');if (request.isCanceled()) { //判斷請求是否取消,如果取消了,那就將該請求finish掉 request.finish('cache-discard-canceled');} else { Entry entry = this.mCache.get(request.getCacheKey()); if (entry == null) {//如果從緩存中取出來的內容為空,則將請求加入到網絡線程中再次請求request.addMarker('cache-miss');this.mNetworkQueue.put(request); } else if (entry.isExpired()) { //如果請求過期了,則將請求加入到網絡線程中再次請求request.addMarker('cache-hit-expired');request.setCacheEntry(entry);this.mNetworkQueue.put(request); } else { //將數據回調到主線程request.addMarker('cache-hit');Response<?> response = request.parseNetworkResponse(new NetworkResponse(entry.data, entry.responseHeaders));request.addMarker('cache-hit-parsed');if (entry.refreshNeeded()) { request.addMarker('cache-hit-refresh-needed'); request.setCacheEntry(entry); response.intermediate = true; this.mDelivery.postResponse(request, response, new Runnable() {public void run() {try { CacheDispatcher.this.mNetworkQueue.put(request);} catch (InterruptedException var2) { ;}} });} else { this.mDelivery.postResponse(request, response);} }} }} catch (InterruptedException var4) { if (this.mQuit) {return; }} }} }} }

這里嵌套了幾個循環,有點凌亂啊,但是慢慢分析的話,就會發現,其實很清晰。我在注釋上面寫了,這里就不重復了

我們在看看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()) { //如果請求取消了,則將請求finish掉 request.finish('network-discard-cancelled');} else {//進行網絡請求 this.addTrafficStatsTag(request); NetworkResponse networkResponse = this.mNetwork.performRequest(request); request.addMarker('network-http-complete'); if (networkResponse.notModified && request.hasHadResponseDelivered()) {request.finish('not-modified'); } else {Response<?> response = request.parseNetworkResponse(networkResponse);request.addMarker('network-parse-complete');if (request.shouldCache() && response.cacheEntry != null) { this.mCache.put(request.getCacheKey(), response.cacheEntry); request.addMarker('network-cache-written');}request.markDelivered();this.mDelivery.postResponse(request, response); }} } 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); }} }

代碼比較多,我們直接找到NetworkResponse networkResponse = this.mNetwork.performRequest(request);這句代碼,這句代碼就是請求網絡的代碼,最核心的。performRequest是一個接口,我們看看這個performRequest()方法。Network在最開始說版本判斷的時候里面有一句代碼Network network = new BasicNetwork((HttpStack)stack); 從這句代碼,我們可以知道BasicNetwork才是最終實現網絡請求的類,我們找到performRequest方法

public NetworkResponse performRequest(Request<?> request) throws VolleyError {long requestStart = SystemClock.elapsedRealtime();while(true) { HttpResponse httpResponse = null; byte[] responseContents = null; Map responseHeaders = Collections.emptyMap(); try {Map<String, String> headers = new HashMap();this.addCacheHeaders(headers, request.getCacheEntry());httpResponse = this.mHttpStack.performRequest(request, headers);StatusLine statusLine = httpResponse.getStatusLine();int statusCode = statusLine.getStatusCode();responseHeaders = convertHeaders(httpResponse.getAllHeaders());if (statusCode == 304) { Entry entry = request.getCacheEntry(); if (entry == null) {return new NetworkResponse(304, (byte[])null, responseHeaders, true, SystemClock.elapsedRealtime() - requestStart); } entry.responseHeaders.putAll(responseHeaders); return new NetworkResponse(304, entry.data, entry.responseHeaders, true, SystemClock.elapsedRealtime() - requestStart);}if (statusCode == 301 || statusCode == 302) { String newUrl = (String)responseHeaders.get('Location'); request.setRedirectUrl(newUrl);}byte[] responseContents;if (httpResponse.getEntity() != null) { responseContents = this.entityToBytes(httpResponse.getEntity());} else { responseContents = new byte[0];}long requestLifetime = SystemClock.elapsedRealtime() - requestStart;this.logSlowRequests(requestLifetime, request, responseContents, statusLine);if (statusCode >= 200 && statusCode <= 299) { return new NetworkResponse(statusCode, responseContents, responseHeaders, false, SystemClock.elapsedRealtime() - requestStart);}throw new IOException(); } catch (SocketTimeoutException var12) {attemptRetryOnException('socket', request, new TimeoutError()); } catch (ConnectTimeoutException var13) {attemptRetryOnException('connection', request, new TimeoutError()); } catch (MalformedURLException var14) {throw new RuntimeException('Bad URL ' + request.getUrl(), var14); } catch (IOException var15) {int statusCode = false;NetworkResponse networkResponse = null;if (httpResponse == null) { throw new NoConnectionError(var15);}int statusCode = httpResponse.getStatusLine().getStatusCode();if (statusCode != 301 && statusCode != 302) { VolleyLog.e('Unexpected response code %d for %s', new Object[]{statusCode, request.getUrl()});} else { VolleyLog.e('Request at %s has been redirected to %s', new Object[]{request.getOriginUrl(), request.getUrl()});}if (responseContents == null) { throw new NetworkError(networkResponse);}networkResponse = new NetworkResponse(statusCode, (byte[])responseContents, responseHeaders, false, SystemClock.elapsedRealtime() - requestStart);if (statusCode != 401 && statusCode != 403) { if (statusCode != 301 && statusCode != 302) {throw new ServerError(networkResponse); } attemptRetryOnException('redirect', request, new AuthFailureError(networkResponse));} else { attemptRetryOnException('auth', request, new AuthFailureError(networkResponse));} }} }

代碼比較多,但是大多數代碼是判斷狀態返回碼的,不需要理會。

我們直接看httpResponse = this.mHttpStack.performRequest(request, headers);這一句代碼,HttpStack這個有沒有很熟悉。沒有??沒關系我在復制一次代碼

if (stack == null) { if (VERSION.SDK_INT >= 9) {stack = new HurlStack(); } else {stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent)); }}

還是在這個版本判斷這里,這里就是HurlStack就是真正的網絡請求的類了,網絡請求,就是寫在這個類里面的。好了,volley整個流程大概就是這樣了。現在大家回過頭看最初的哪一張圖,是不是明了很多。

以上就是解析Android框架之Volley源碼的詳細內容,更多關于Android框架之Volley源碼的資料請關注好吧啦網其它相關文章!

標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
精品一区二区三区的国产在线观看 | 美女免费视频一区| 国产模特精品视频久久久久| av资源中文在线| 麻豆精品久久| 国产一区二区三区四区大秀| 精品亚洲免a| 国产一区二区精品久| 国产精品一级| 国产一区二区精品久| 久久伊人久久| 国产va在线视频| 激情欧美国产欧美| 国产农村妇女精品一二区| 视频在线观看91| 国产美女久久| 日韩欧美视频专区| 亚洲一区二区三区高清不卡| 亚洲精品观看| 欧美国产另类| 免费视频国产一区| 亚洲伊人影院| 国模精品一区| 日韩亚洲精品在线| 国产高清亚洲| 伊伊综合在线| 免费在线观看视频一区| 国产欧美日韩影院| 欧美日韩国产传媒| 91精品国产自产精品男人的天堂 | 午夜精品久久久久久久久久蜜桃| 美女亚洲一区| 欧美欧美黄在线二区| 偷拍精品精品一区二区三区| 蜜臀久久99精品久久久久宅男| 国产欧美日韩影院| 午夜国产欧美理论在线播放| 日本午夜精品久久久| 日韩免费一区| 日本亚洲最大的色成网站www | 日本aⅴ亚洲精品中文乱码| www.com.cn成人| 91麻豆精品激情在线观看最新 | 亚洲久久在线| 欧美二区视频| 久草免费在线视频| 国产精品久久777777毛茸茸| 亚洲在线电影| 蜜桃视频欧美| 国产在线不卡一区二区三区| 日韩1区2区3区| 蜜桃av一区二区| 精品一区三区| 午夜国产精品视频免费体验区| 成人免费一区| 国产精品99一区二区三| 国产精品亚洲欧美日韩一区在线| 99国产精品视频免费观看一公开| 亚洲女同av| 蜜臀国产一区| a国产在线视频| 成人在线视频中文字幕| 精品国产亚洲一区二区在线观看| 国产欧美激情| 日本综合精品一区| 亚洲aa在线| 97成人在线| 久久久久伊人| 日韩免费高清| 国产精品美女久久久| 蜜臀久久99精品久久久久宅男 | 最新中文字幕在线播放| 精品久久久中文字幕| 一区二区精品伦理...| 国产v综合v| 天使萌一区二区三区免费观看| 亚洲一区成人| 青青国产91久久久久久| 视频一区中文字幕| 久久精品超碰| 91一区二区| 亚洲少妇自拍| 国产精品一区二区中文字幕| 国产精品一区二区av日韩在线| 国产欧美一区二区色老头| 久久香蕉精品香蕉| 欧美二区视频| 国产乱子精品一区二区在线观看| 久久精品国产久精国产| 久久精品1区| 亚洲一区二区三区久久久| 91av一区| 成人啊v在线| 亚洲我射av| 精品三级av在线导航| 国产综合色区在线观看| 蜜桃久久av一区| 久久久久久夜| 国产精品视区| 国产精品久久观看| 日韩精品视频中文字幕| 日本免费久久| 日韩精品社区| 在线亚洲激情| 高潮久久久久久久久久久久久久| 99成人在线| 久久激情婷婷| 国产成人精品一区二区三区免费| 午夜精品亚洲| 国产不卡一区| 日韩激情中文字幕| 自由日本语亚洲人高潮| 日韩国产欧美| 精品视频高潮| 日本免费新一区视频| 欧美成人国产| 久久国产中文字幕| 精品深夜福利视频| 国产日韩一区二区三免费高清| 欧美精品自拍| 欧产日产国产精品视频| 国产精品久久国产愉拍| 亚洲精品看片| 亚洲免费高清| 91精品蜜臀一区二区三区在线| 麻豆视频一区| 精品国产午夜| 精品久久91| 欧美国产美女| 神马久久午夜| 偷拍精品精品一区二区三区| 欧洲精品一区二区三区| 97精品中文字幕| 樱桃视频成人在线观看| 秋霞影院一区二区三区| 国产一卡不卡| 精品国产一区二区三区性色av| 国产精品久久久久久久久久妞妞 | 综合日韩在线| 亚洲欧美网站在线观看| 日韩综合一区二区| 亚洲a级精品| 麻豆一区二区在线| 99久久久久| 蜜臀av一区二区三区| 日本不卡一区二区| 国产精品传媒麻豆hd| 久久91视频| 免费日韩av片| 国产精品日本一区二区三区在线 | 免费在线看一区| 国产精品极品在线观看| 亚洲国产福利| 一区二区亚洲视频| 成人三级高清视频在线看| 国产一区日韩欧美| 清纯唯美亚洲综合一区| 天堂av在线| 久久国产欧美日韩精品| 日韩一区二区三区在线免费观看| 国产亚洲午夜| 久久不卡日韩美女| 亚洲性视频h| 久久三级毛片| 亚洲狼人精品一区二区三区| 欧美激情视频一区二区三区免费 | 日韩电影在线视频| 一区二区三区四区日韩| 欧美激情视频一区二区三区在线播放| 蜜桃av在线播放| 国产精品地址| 三级欧美韩日大片在线看| 久久精品一本| 亚洲精品一二三**| 精品日韩毛片| 日韩理论视频| 精品亚洲成人| 国产精品久久久久毛片大屁完整版 | 青草久久视频| 日韩欧美中文字幕在线视频| 99久久精品费精品国产| 久久99免费视频| 日韩av一区二| 亚洲精品一区二区在线播放∴| 成人啊v在线| 日韩一区亚洲二区| 精品中文字幕一区二区三区四区| 日本午夜精品久久久久| 日韩精品成人在线观看| 亚洲久久一区| 日韩欧美四区| 日韩有吗在线观看| 日韩视频1区| 亚洲午夜久久久久久尤物| 亚洲婷婷丁香| 日韩欧美中文字幕电影 | 国产精品1区| 91欧美极品| 国产伦精品一区二区三区视频| 国产精品亲子伦av一区二区三区|