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

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

解析Android框架之Volley源碼

瀏覽:72日期: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久久,三上悠亚国产精品一区二区三区
亚洲欧美久久精品| 999久久久免费精品国产| 深夜福利视频一区二区| 麻豆高清免费国产一区| 久久精品99国产精品日本| 红桃视频国产精品| 日韩视频二区| 99国产精品久久久久久久| 免费不卡在线观看| 尹人成人综合网| 精品久久影院| 中文在线免费视频| 精品中国亚洲| 欧美激情视频一区二区三区在线播放| 免费亚洲一区| 成人午夜国产| 国产精品av久久久久久麻豆网| 亚洲天堂久久| 亚洲影视一区| 久久久91麻豆精品国产一区| 四虎国产精品免费观看| 国产精品一区二区三区美女| 亚洲成人一区| 日韩午夜视频在线| 91麻豆精品| 天堂√8在线中文| 国产精品老牛| 国产高清视频一区二区| 麻豆极品一区二区三区| 青青青免费在线视频| 欧美综合另类| 日韩三级视频| 国产va在线视频| 喷白浆一区二区| 国产精品成人一区二区不卡| 视频一区二区国产| 国产不卡人人| 欧美日本不卡高清| 蜜桃成人av| 久久一区视频| 日本欧美久久久久免费播放网| 日韩不卡免费高清视频| 欧美日韩一区二区国产| 国语精品一区| 国产亚洲高清一区| 欧美午夜不卡| 久久久久久美女精品| 国产精品**亚洲精品| 欧美日韩国产免费观看 | 国产美女久久| 国产综合欧美| 人人草在线视频| 国产66精品| 水蜜桃精品av一区二区| 精品三级av| 精品少妇av| 欧美日本久久| 欧美在线91| 国产精品一区高清| 成人在线免费观看网站| 超碰99在线| 日韩精品午夜| 久久精品电影| 日韩欧美一区二区三区免费观看| 蜜桃视频在线观看一区二区| 久久精品一区二区不卡| 亚洲欧美在线综合| 国产成人精品一区二区三区免费 | 国产精品极品在线观看| 亚洲另类视频| 精品美女久久| 亚洲精品综合| 爽好久久久欧美精品| 亚洲精品日本| 久久中文字幕一区二区三区| 性欧美xxxx免费岛国不卡电影| 亚洲精品一二三**| av资源亚洲| 日韩中文字幕视频网| 国产一区二区三区久久| 蜜桃视频在线观看一区| 亚洲激情国产| 岛国av免费在线观看| 牛牛精品成人免费视频| 欧美日一区二区在线观看| 亚洲综合电影一区二区三区| 婷婷综合成人| 久久激情综合网| 日韩一区电影| 美女精品视频在线| 亚洲一区二区三区高清| 日韩精品电影| 国产精品115| 日本午夜免费一区二区| 欧美有码在线| 国产在线观看91一区二区三区| 国产精品美女在线观看直播| 国产精区一区二区| 免费观看亚洲| 日韩一级欧洲| 国产精品一区二区三区av麻| 欧美成人基地| 国产精品亚洲片在线播放| 91成人精品视频| 国产精品久久久久av蜜臀| 麻豆91精品91久久久的内涵| 国产精品分类| 国产精品蜜月aⅴ在线| 国际精品欧美精品| 99久久亚洲精品蜜臀| 亚洲性视频h| 亚洲精品大全| 久久亚洲人体| 免费不卡中文字幕在线| 亚洲精品成人一区| 中文一区一区三区高中清不卡免费| 欧美激情99| 成人综合一区| 国产一在线精品一区在线观看| 久久中文字幕二区| 久久国产精品免费一区二区三区| 久久精品国产99国产| 日韩精品一二三四| 综合日韩av| 久久成人福利| 福利视频一区| 免费观看久久av| 成人av二区| 国产麻豆精品| 红杏一区二区三区| 亚洲黄色中文字幕| 国产91久久精品一区二区| 亚洲一级网站| 日本va欧美va瓶| 亚洲黄色网址| 日韩美女精品| 999国产精品永久免费视频app| 国产精品网在线观看| 91精品观看| 国产精品久久久久久久免费观看| 三级亚洲高清视频| 中文不卡在线| 欧美一级鲁丝片| 蜜臀av亚洲一区中文字幕| 精品久久精品| 精品91久久久久| 久久久久久免费视频| 亚洲精品一级二级| 色综合五月天| 久久久成人网| 在线一区视频| 国产一区二区三区国产精品| 中文一区一区三区免费在线观 | 夜夜嗨一区二区| 精品久久99| 久久亚洲道色| 国产乱码精品一区二区三区四区| 国产乱人伦丫前精品视频 | 亚洲性视频h| 国产精品试看| 鲁大师影院一区二区三区| 欧美亚洲精品在线| 日韩中文字幕一区二区三区| 国产精品乱战久久久| 欧美日韩免费看片| 免费观看不卡av| 欧美在线首页| 夜夜嗨av一区二区三区网站四季av| 尤物精品在线| 日韩精品91亚洲二区在线观看| 美国欧美日韩国产在线播放| 亚洲二区精品| 欧美日韩国产在线观看网站| 国产精品大片| 日本欧美不卡| 免费日本视频一区| 中文字幕日韩亚洲| 久久精品一区二区三区中文字幕| 国产专区一区| 日韩欧美精品一区| 精品久久久网| 日韩免费在线| 亚洲毛片在线| 欧美永久精品| 亚洲天堂黄色| 老牛国内精品亚洲成av人片| 午夜日韩在线| 日韩综合一区二区| 国产精品午夜一区二区三区| 精品视频在线你懂得| 国精品产品一区| 中文精品在线| 一区二区电影| 成人羞羞视频在线看网址| 欧美精选一区二区三区| 97成人超碰| 亚洲欧美日韩国产一区| 日韩高清欧美激情| 伊人久久视频| 日韩国产精品久久久|