精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

網絡框架分析 – 全是套路

移動開發 Android
這幾天抽時間啃完了Volley和Picasso的源碼,收獲頗多,所以在這里跟大家分享一下。

前言

這幾天抽時間啃完了Volley和Picasso的源碼,收獲頗多,所以在這里跟大家分享一下。

對于網絡請求框架或者圖片加載框架來說,我們的理想型大體應該是這樣的:

  • 簡單:框架的出現當然是為了提升我們的開發效率,使我們的開發變得簡單,所以在保證質量的情況下簡單是第一位的
  • 可配置:天底下沒有完全相同的兩片樹葉,也沒有完全相同的兩個項目,所以某些差異應該是可配置的,比如緩存位置、緩存大小、緩存策略等等
  • 方便擴展:框架在設計的時候就要考慮到變化,并且封裝起來。舉個例子,比如有了更好的Http客戶端,我們應該能很方便的修改并且不能對我們之前的代碼產生太大影響

但萬變不離其宗,這些框架的骨架其實基本上都是一樣的,今天我們就來討論下這些框架中的套路。

基本模塊

既然我們說這些框架的結構其實基本上都是一樣的,那么我們就先來看看它們之間類似的模塊結構。 

 

 

 

整體流程大概是這樣的:

客戶端請求->生成框架封裝的請求類型->調度器開始處理任務->調用數據獲取模塊->對獲取的數據進行處理->回調給客戶端

生產者消費者模型

框架中請求管理和任務調度模塊一般會用到生產者消費者模型。

為什么會有生產者消費者模型

在線程世界里,生產者就是生產數據的線程,消費者就是消費數據的線程。在多線程開發當中,如果生產者處理速度很快,而消費者處理速度很慢,那么生產者就必須等待消費者處理完,才能繼續生產數據。同樣的道理,如果消費者的處理能力大于生產者,那么消費者就必須等待生產者。為了解決這個問題于是引入了生產者和消費者模型。

什么是生產者消費者模型

生產者消費者模式是通過一個容器來解決生產者和消費者的強耦合問題。生產者和消費者彼此之間不直接通訊,而通過阻塞隊列來進行通訊,所以生產者生產完數據之后不用等待消費者處理,直接扔給阻塞隊列,消費者不找生產者要數據,而是直接從阻塞隊列里取,阻塞隊列就相當于一個緩沖區,平衡了生產者和消費者的處理能力。

生產者消費者模型的使用場景

Java中的線程池類其實就是一種生產者和消費者模式的實現方式,但是實現方法更高明。生產者把任務丟給線程池,線程池創建線程并處理任務,如果將要運行的任務數大于線程池的基本線程數就把任務扔到阻塞隊列里,這種做法比只使用一個阻塞隊列來實現生產者和消費者模型顯然要高明很多,因為消費者能夠處理直接就處理掉了,這樣速度更快,而生產者先存,消費者再取這種方式顯然慢一些。

框架中的應用

對于上述的使用場景我們分別可以在框架中找到實現。

Volley源碼中實現方式是用一個優先級阻塞隊列來實現生產者消費者模型。生產者是往隊列里添加數據的線程,消費者是一個默認4個元素的線程數組(不包括處理緩存的線程),來不停的取出消息處理。

而Picssso是一個比較典型的線程池實現的生產者消費者模型,這里就不做過多介紹了。

這兩個框架使用的數據結構都是PriorityBlockingQueue(優先級阻塞隊列),目的是為了做排序,保證優先級高的請求先被處理。

順便說一下Android的消息處理機制其實也是一個生產者消費者模型。

一個小問題

這里博主當時想到了一個小問題:那就是喚醒消費者的時候喚醒的順序是怎樣的?

這里涉及到一個概念叫公平訪問隊列,所謂公平訪問隊列是指所有阻塞的生產者線程或者消費者線程,當隊列可用是,可以按照阻塞的先后順序訪問隊列,即先阻塞的生產者線程,可以先往隊列里插入元素,先阻塞的消費者線程,可以先從隊列里獲取元素。通常情況下為了保證公平性會降低吞吐量。

緩存

Android緩存分為內存緩存和文件緩存(磁盤緩存)。

一般網絡框架是不需要處理內存緩存的,但是圖片加載框架需要。在Android3.1以后,Android推出了LruCache這個內存緩存類,LruCache中的對象是強引用的。Picasso的內存緩存就是使用的LruCache實現的。對于磁盤緩存,Google提供的一種解決方案是使用DiskLruCache(DiskLruCache并沒有集成到Android源碼中,在Android Doc的例子中有講解)。Picasso的磁盤緩存是基于okhttp的,使用了DiskLruCache。而Volley的磁盤緩存是在DiskBasedCache中實現得,也是基于Lru算法的。

至于其他緩存算法、緩存命中率等等概念這里我就不做過多介紹了。

異步的處理

我們知道Android是單線程模型,我們應該避免在UI線程中進行耗時操作,網絡請求算是一個比較典型的耗時操作,所以網絡相關的框架中都會對異步操作進行一些封裝。

其實這里沒什么復雜的地方,無非就是利用Handler進行線程間通信,然后配合回調機制,把結果返回到主線程里。這里可以參考我之前的文章《Android Handler 消息機制(解惑篇)》和《當觀察者模式和回調機制遇上Android源碼》。

我們以Volley為例來簡單看一下,ExecutorDelivery類的職責是分發子線程產生的responses數據或者錯誤信息。初始化是在RequestQueue類里。

  1. public RequestQueue(Cache cache, Network network, int threadPoolSize) { 
  2.         this(cache, network, threadPoolSize, 
  3.                 new ExecutorDelivery(new Handler(Looper.getMainLooper()))); 
  4.     }  

這里傳入的是主線程的Handler對象,而這個ExecutorDelivery對象會被傳入到NetworkDispatcher和CacheDispatcher中,這兩個類是繼承于Thread的,負責處理隊列中的請求。所以處理請求的操作是發生在子線程的。

然后我們看下ExecutorDelivery類的構造方法

  1. public ExecutorDelivery(final Handler handler) { 
  2.         // Make an Executor that just wraps the handler. 
  3.         mResponsePoster = new Executor() { 
  4.             @Override 
  5.             public void execute(Runnable command) { 
  6.                 handler.post(command); 
  7.             } 
  8.         }; 
  9.     }  

這里用Executor對Handler進行了一層包裝。Volley中的responses數據或者錯誤信息都會通過Executor發送出去,這樣消息就到了主線程中。

Picasso比Volley要稍稍復雜了一點,由Picasso會對圖片進行變換等操作,屬于耗時操作,所以在Picasso中請求的分發和結果的處理會單獨放到一個線程中。這個線程是一個帶有消息隊列的線程,用來執行循環性任務,即對獲取到的數據進行處理。當它對結果處理完成之后,才會通過主線程的Handler把結果發送回主線程進行顯示等操作。

設計模式

優秀的框架會合理的利用設計模式,使代碼易于擴展和后期的維護。這里有一些出現頻率比較高的設計模式。

  • 靜態工廠方法:由一個工廠對象決定創建出哪一種產品類的實例
  • 單例模式:確保有且只有一個對象被創建
  • 建造者模式:將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示
  • 外觀模式:簡化一群類的接口
  • 命令模式:封裝請求成為對象
  • 策略模式:封裝可以互選的行為,并使用委托來決定使用哪一個

框架入口

一般框架為了調用簡潔,并不會讓客戶端直接通過new實例化一個入口對象。這里就需要用到創建型模式。

Volley的入口使用的是靜態工廠方法,與Android源碼中Bitmap的實例化類似,具體可以參考《Android源碼中的靜態工廠方法》

  1. /** 
  2.   * Creates a default instance of the worker pool and calls {@link RequestQueue#start()} on it. 
  3.   * 
  4.   * @param context A {@link Context} to use for creating the cache dir. 
  5.   * @return A started {@link RequestQueue} instance. 
  6.   */ 
  7. public static RequestQueue newRequestQueue(Context context) { 
  8.   return newRequestQueue(context, null); 
  9.  

Picasso的入口方法則用到了雙重鎖的單例模式

  1. static volatile Picasso singleton = null
  2. public static Picasso with(Context context) { 
  3.     if (singleton == null) { 
  4.       synchronized (Picasso.class) { 
  5.         if (singleton == null) { 
  6.           singleton = new Builder(context).build(); 
  7.         } 
  8.       } 
  9.     } 
  10.     return singleton; 
  11.   } 

同時由于可配置項太多,所以Picasso還使用了Builder模式。

同時一些框架為了給給客戶端提供一個簡潔的的API,會使用外觀模式定義一個高層接口,使得框架中的各個模塊更加容易使用。外觀模式是一種結構型模式。

外觀模式可以參考《Android源碼中的外觀模式》

命令模式

命令模式的定義是將一個請求封裝成一個對象,從而使你可用不同的請求對客戶進行參數化,對請求排隊或記錄請求日志,以及支持可撤銷的操作。在網絡請求框架中都會將請求做一個封裝成對象,方便傳遞和使用。比如Volley中的Request,Picasso中的Request和Action。

命令模式可以參考《Android源碼中的命令模式》

策略模式

策略模式也是大部分框架都會用到的一個模式 ,作用是封裝可以互選的行為,并使用委托來決定使用哪一個。

Volley中就大量使用了面向接口編程的編程思想。這里我們看下Volley的入口方法

  1. public static RequestQueue newRequestQueue(Context context, HttpStack stack, int maxDiskCacheBytes) { 
  2.   //~省略部分無關代碼~ 
  3.   if (stack == null) { 
  4.     if (Build.VERSION.SDK_INT >= 9) { 
  5.       stack = new HurlStack(); 
  6.     } else { 
  7.       // Prior to Gingerbread, HttpUrlConnection was unreliable. 
  8.       // See: http://android-developers.blogspot.com/2011/09/androids-http-clients.html 
  9.       stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent)); 
  10.     } 
  11.   } 
  12.   
  13.   Network network = new BasicNetwork(stack); 
  14.   //~省略部分無關代碼~ 
  15.  

這里會根據API版本選擇不同的Http客戶端,它們實現了一個共同的接口

  1. /** 
  2.  * An HTTP stack abstraction. 
  3.  */ 
  4. public interface HttpStack { 
  5.   /** 
  6.      * Performs an HTTP request with the given parameters. 
  7.      * 
  8.      * <p>A GET request is sent if request.getPostBody() == null. A POST request is sent otherwise, 
  9.      * and the Content-Type header is set to request.getPostBodyContentType().</p> 
  10.      * 
  11.      * @param request the request to perform 
  12.      * @param additionalHeaders additional headers to be sent together with 
  13.      *         {@link Request#getHeaders()} 
  14.      * @return the HTTP response 
  15.      */ 
  16.   public HttpResponse performRequest(Request<?> request, Map<String, String> additionalHeaders) 
  17.     throws IOException, AuthFailureError; 
  18.   
  19.  

當然我們也可以自己實現這個接口,然后把Http客戶端換成okhttp。

后記

網絡相關的框架套路基本上就這些了,具體細節大家可以去自己看下相關源碼。如果有什么不完善或者不對的地方也請大家多指教。

責任編輯:龐桂玉 來源: 安卓開發精選
相關推薦

2018-08-24 13:55:05

2023-03-27 16:21:22

2017-10-26 10:58:47

筆記本廠商售價

2021-01-28 09:20:18

網絡犯罪網絡安全監管

2023-01-10 11:29:34

2013-01-30 09:42:46

2021-11-10 14:48:21

深信服網絡安全數據

2017-01-19 15:49:28

2018-10-09 15:02:49

2019-11-05 15:57:23

網絡安全技術防火墻

2019-04-25 14:20:56

數據分析套路工具

2014-04-29 09:15:00

2020-10-09 10:00:29

網絡安全數字化轉型遠程辦公

2022-08-03 12:01:33

WAF漏洞網絡攻擊

2010-09-28 15:28:34

2021-08-16 07:20:47

網絡詐騙支付寶學生賬戶

2009-07-16 17:01:32

ibatis dao

2021-08-11 07:22:27

Vue 技巧 開發工具

2010-01-11 10:41:31

2019-07-25 07:04:33

網絡安全技術物聯網
點贊
收藏

51CTO技術棧公眾號

亚洲成人第一| 欧美精品videos| 日本激情综合网| 2019中文字幕在线视频| 蜜桃av一区二区在线观看| 亚洲激情电影中文字幕| 亚洲熟妇无码另类久久久| 三级视频在线看| 三级一区在线视频先锋| 色婷婷**av毛片一区| 青青草久久伊人| 波多野结衣乳巨码无在线观看| 91伊人久久大香线蕉| 秋霞av国产精品一区| 国产男男chinese网站| 台湾天天综合人成在线| 亚洲一区二区三区在线播放| 蜜桃av噜噜一区二区三| 中文字幕 日韩有码| 欧美日本不卡高清| 亚洲色图欧美制服丝袜另类第一页| 日本在线观看免费视频| 亚洲小说区图片| 2023国产一二三区日本精品2022| 国产精品永久免费在线| 久久影院一区二区| 亚洲人成精品久久久| 欧美精品免费视频| 国产精品无码一区二区在线| 天堂中文а√在线| 北条麻妃一区二区三区| 国产精品久久国产精品99gif| 日本免费网站视频| 精品五月天堂| 欧美年轻男男videosbes| 日韩精品综合在线| 在线视频婷婷| www一区二区| 亚洲淫片在线视频| 日本a级c片免费看三区| 激情婷婷久久| 久久影院模特热| 18禁裸乳无遮挡啪啪无码免费| 性欧美video另类hd尤物| 精品国产1区2区| av不卡在线免费观看| 男人天堂资源在线| 成人午夜精品在线| 成人在线小视频| 日韩不卡高清视频| 亚洲精品1区2区| 欧美成人第一页| 自拍偷拍第9页| 中文字幕av一区二区三区人| 亚洲第一色中文字幕| 五月天激情播播| 亚洲精品.com| 日韩欧美国产视频| 久久久久久久久久网| 国产在线高潮| 国产精品福利av| 日韩一区二区三区资源| 视频一区二区三区国产| 成人av在线影院| 成人激情av| 国产精品人妻一区二区三区| 蜜臀av性久久久久蜜臀aⅴ| 日韩av大片免费看| 精品少妇theporn| 欧美日韩三级电影在线| 久久成年人视频| 一区二区三区四区五区| 婷婷综合网站| 久久精品国产欧美激情| 在线免费看视频| 日韩欧美三级| 亚洲欧美日韩爽爽影院| 国产ts丝袜人妖系列视频| 另类春色校园亚洲| 亚洲精品一区二区三区福利 | 成人天堂噜噜噜| 久久影视中文字幕| 日韩av一级电影| 国产精品日韩专区| 日本一区二区三区久久| 麻豆精品一区二区av白丝在线| 国产精品专区一| 一级片在线观看视频| 国产综合久久久久影院| 亚洲综合中文字幕68页| 无码人妻精品一区二区三区不卡 | 久久91亚洲精品中文字幕奶水| 波多野结衣在线网址| 亚洲国产精品久久久天堂| 九九热精品视频国产| 精品一级少妇久久久久久久| 一本综合精品| 国产精品扒开腿做爽爽爽男男 | 亚洲妇熟xxxx妇色黄| 亚洲一区二区四区蜜桃| 欧美激情视频免费看| 久久青草伊人| 日本精品一级二级| 午夜视频在线网站| 日韩欧美中文在线观看| 国产偷亚洲偷欧美偷精品| 精品人妻中文无码av在线| 性xxxx欧美老肥妇牲乱| 久久久久久av| 一级特黄免费视频| 狠狠色丁香婷综合久久| 国产成人亚洲欧美| 国产女人在线观看| 国产精品久久久久久久久快鸭 | 久久精品影视| 久久免费视频观看| 日韩国产成人在线| 国产黄人亚洲片| 欧美一级二级三级九九九| 麻豆最新免费在线视频| 亚洲色图.com| 久草资源站在线观看| 国产精品原创视频| 精品久久久久av影院| 五月天精品视频| 午夜精品毛片| 日本精品久久久久久久| 国内老熟妇对白hdxxxx| 久久久99久久| 国产在线视频综合| 成人涩涩视频| 亚洲精品第一国产综合精品| 成人欧美一区二区三区黑人一| 亚洲精品乱码| 亚洲xxx视频| 成人不用播放器| 精品电影在线观看| 在线成人精品视频| 日韩夫妻性生活xx| 777国产偷窥盗摄精品视频| 国产又大又黄又爽| 丁香啪啪综合成人亚洲小说| 亚洲欧美99| 人在线成免费视频| 日韩亚洲欧美高清| 黑人と日本人の交わりビデオ| 国产一区二区三区久久| 成人性生交大片免费看小说| 国产中文在线| 狠狠做深爱婷婷久久综合一区| 永久av免费在线观看| 久久美女精品| 国产精品日韩专区| 欧美zzoo| 欧美午夜激情在线| 极品白嫩的小少妇| 亚洲国产精品成人| 成人精品在线视频| av网站无病毒在线| 91传媒视频在线播放| 大尺度做爰床戏呻吟舒畅| 永久91嫩草亚洲精品人人| 国产91精品不卡视频| 肥臀熟女一区二区三区| 伊人性伊人情综合网| 欧美丝袜在线观看| 91综合在线| 国产精品视频免费在线观看| 丁香婷婷在线观看| 91久久精品一区二区| 性久久久久久久久久 | 久草热视频在线观看| 高清日韩欧美| 久久久久久亚洲精品| 亚洲精品久久久久久久久久久久久久| 亚洲欧美色一区| 欧美男女交配视频| 97精品国产一区二区三区| 国产美女久久久| 黄色一级大片在线免费看产| 欧美一区二区三区日韩视频| 青青草原在线免费观看视频| 青娱乐精品视频| 日本免费高清一区| 国产成人免费精品| 日韩中文字幕不卡视频| 国产女18毛片多18精品| 一区二区三区欧美久久| 日本精品一二三区| 制服诱惑一区二区| 欧美一卡2卡3卡4卡无卡免费观看水多多| 小草在线视频免费播放| 国产亚洲成精品久久| 在线免费看91| 亚洲精品精品亚洲| 免费看毛片的网站| 久久一区中文字幕| 一区二区三区四区在线视频| 久久国产精品美女| 久久久久久久亚洲精品| 免费黄色在线视频网站| 欧美日韩精品一区二区在线播放| 国产美女久久久久久| 99久久婷婷国产| 成人3d动漫一区二区三区| 午夜免费一区| 久久免费视频1| 亚洲色图综合| 性色av一区二区三区在线观看| 国产尤物视频在线| 欧美三级视频在线播放| 免费在线黄色片| 91啪九色porn原创视频在线观看| 向日葵污视频在线观看| 国产精品成人一区二区网站软件| 免费国产一区| 精品一区91| 日韩暖暖在线视频| av在线影院| 亚洲欧美成人网| 国产成人精品av在线观| 色94色欧美sute亚洲线路一ni| 免费一级做a爰片久久毛片潮| 国产精品亚洲专一区二区三区 | 久久久久亚洲无码| 日本美女一区二区| 一区二区在线观看网站| 同性恋视频一区| 亚洲bt欧美bt日本bt| 日韩国产激情| 高清欧美电影在线| 搞黄视频免费在线观看| 亚洲国产另类 国产精品国产免费| 影音先锋国产资源| 欧美性xxxxx极品| 欧美黑人精品一区二区不卡| 国产欧美精品国产国产专区| 黄色污在线观看| 国产自产v一区二区三区c| 欧美日韩一区二区在线免费观看| 黄色成人91| 日韩中文一区二区三区| 欧美丝袜美腿| 超碰97人人在线| 韩国三级成人在线| 国产区亚洲区欧美区| 欧美中文字幕精在线不卡| 国产69精品久久久久9999| 午夜在线激情影院| 中文字幕国内精品| 国产二区视频在线观看| 精品亚洲一区二区三区在线观看| 性生活三级视频| 欧美一区午夜精品| 91亚洲视频在线观看| 欧美性videosxxxxx| 无码人妻av免费一区二区三区| 天天操天天综合网| 国产成人无码精品| 天天综合色天天综合色h| 久久国产在线观看| 亚洲欧美区自拍先锋| 艳妇荡乳欲伦69影片| 国产精品欧美一级免费| 91精品国自产在线| 美女av一区| 3d成人h动漫网站入口| 中文字幕一区二区三区四区欧美| 岛国精品视频在线播放| 五月天婷婷网站| 午夜精品123| 天天综合天天做| 一区二区三区蜜桃网| 久草视频在线资源| 亚洲国产视频一区二区| 国产精品成人国产乱| 亚洲国产cao| 四虎成人永久免费视频| 日韩欧美国产骚| 亚洲男人天堂网址| 欧美日韩高清影院| 国产xxxxxx| 日韩精品一区二区三区四区| 亚洲黄色在线观看视频| 亚洲成av人片在线观看香蕉| 亚洲欧洲精品视频| 亚洲欧美视频在线| 国产黄色片在线播放| 色婷婷**av毛片一区| av在线导航| 午夜精品视频在线| 成人私拍视频| 国产欧亚日韩视频| 久久精品一级| 国产精品一区免费观看| 曰本一区二区三区视频| 亚洲精品久久久久久一区二区| 国产亚洲第一伦理第一区| 亚洲黄色一区二区三区| 欧美精品麻豆| 欧美 国产 综合| 翔田千里一区二区| 中文字幕第17页| 国产99久久久精品| 少妇大叫太粗太大爽一区二区| 国产精品污www在线观看| 四虎影视一区二区| 午夜欧美一区二区三区在线播放| 国语对白做受69按摩| 日韩亚洲欧美在线观看| 久草视频在线看| 久久久久久久久久婷婷| 日韩黄色在线| 欧美激情第一页在线观看| 亚洲私拍自拍| 在线观看免费不卡av| 久久精品夜色噜噜亚洲a∨| 久久精品一区二区三| 欧美日韩另类国产亚洲欧美一级| 日本ー区在线视频| 欧美黑人性视频| 91精品一久久香蕉国产线看观看 | 亚洲欧美日韩国产成人精品影院 | 日韩手机在线导航| 可以免费看污视频的网站在线| 久久久亚洲网站| 亚洲综合网站| japanese在线播放| 精品一区免费av| 精品人体无码一区二区三区| 色综合婷婷久久| 无码h黄肉3d动漫在线观看| 欧美福利在线观看| av日韩一区| 中文字幕在线亚洲三区| 美女视频网站久久| 日韩福利在线视频| 色乱码一区二区三区88| 天堂av在线资源| 91av视频导航| 欧美一区二区三区红桃小说| 亚洲人成无码网站久久99热国产| 国产xxx精品视频大全| 99热精品免费| 日韩欧美一级二级三级久久久| 激情影院在线观看| 成人日韩在线电影| 亚洲第一偷拍| 波多野结衣中文字幕在线播放| 亚洲精品视频在线看| 国产丰满美女做爰| 美女撒尿一区二区三区| 日韩精品一区二区三区中文字幕| 青青草视频国产| 福利一区在线观看| 日韩久久精品视频| 亚洲精品国产精品国自产观看浪潮| av日韩国产| 久久亚洲一区二区| 视频一区免费在线观看| 一级特黄曰皮片视频| 欧美精品日韩综合在线| 亚洲夜夜综合| 国内精品久久国产| 鲁大师影院一区二区三区| 日本精品在线观看视频| 欧美日韩精品一区二区三区四区 | 亚洲av永久无码国产精品久久| 久久久久久国产| 影视先锋久久| 久热精品在线播放| 亚洲人精品一区| 蜜桃视频久久一区免费观看入口| 91精品国产高清自在线看超| 国精一区二区| 精产国品一二三区| 午夜伊人狠狠久久| 成人资源www网在线最新版| 亚洲mm色国产网站| 亚洲伦伦在线| 91在线无精精品白丝| 欧美一区二区播放| 欲香欲色天天天综合和网| 亚洲人一区二区| 粉嫩久久99精品久久久久久夜| 亚洲精品男人的天堂| 中文字幕欧美日韩精品| 91精品丝袜国产高跟在线| 日本成人中文字幕在线| ...av二区三区久久精品| 欧美自拍偷拍第一页| 国产精品成人品| 国自产拍偷拍福利精品免费一 | 国产探花一区在线观看| 日韩欧美理论片| 色综合天天综合给合国产| 精品欧美色视频网站在线观看| 欧美大陆一区二区| 国产精品伊人色| 中文字幕第一页在线播放|