精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

日韩一区在线看| 亚洲欧美日韩国产一区| 日韩午夜在线观看视频| 免费国产黄色网址| 国产一区二区三区福利| 国内成人精品2018免费看| 韩国精品美女www爽爽爽视频| 粉嫩av蜜桃av蜜臀av| 日本午夜精品久久久久| 午夜欧美视频在线观看| 中文字幕一区二区三区5566| 五月婷婷六月色| 精品一区二区三区日韩| 国产91成人video| 国产福利视频网站| 亚洲最好看的视频| 欧美α欧美αv大片| 少妇激情一区二区三区| 91超碰在线播放| 亚洲欧美激情视频在线观看一区二区三区| 免费看成人片| 好男人www在线视频| 久久成人18免费观看| 欧美又大粗又爽又黄大片视频| 天天综合天天做| 日韩成人综合| 国产亚洲欧洲高清一区| 97精品人妻一区二区三区蜜桃| 欧美一级做a| 在线免费不卡视频| 久草资源站在线观看| 国产白丝在线观看| 亚洲乱码日产精品bd| 日韩在线电影一区| 国产午夜在线视频| 久久你懂得1024| 久久国产精品一区二区三区四区 | 欧美性一级生活| 日本www在线播放| 鲁鲁在线中文| 欧美日韩国内自拍| 欧美精品久久久久久久免费| 欧美一卡二卡| 亚洲国产精品一区二区久久恐怖片 | 黑人一区二区| 欧美第一淫aaasss性| 成人做爰视频网站| 91精品综合| 欧美日韩福利在线观看| 91在线播放观看| 欧美在线免费| 久久理论片午夜琪琪电影网| 国产在线视频二区| 国产欧美精品久久| 日本中文字幕成人| 亚洲精品国产欧美在线观看| 日本在线不卡视频一二三区| 国产精品免费一区| 一卡二卡三卡在线观看| 国产一区二区三区在线观看免费| 成人免费看片视频| www.日韩高清| 99热99精品| 欧美日韩大片一区二区三区| 国产色a在线| 国产精品不卡一区| 男人天堂网站在线| 日本不卡网站| 欧美亚洲综合另类| 欧美日韩久久婷婷| 国产精品一线| 亚洲性av网站| 久久国产波多野结衣| 亚洲第一在线| 国产精品第一第二| 国产视频在线观看免费 | 手机毛片在线观看| 小处雏高清一区二区三区| 欧美国产极速在线| 天干夜夜爽爽日日日日| 极品尤物av久久免费看| 国产一区国产精品| sese一区| 亚洲成人免费看| 网站一区二区三区| youjizzjizz亚洲| 中文字幕av一区中文字幕天堂 | 午夜在线观看一区| 久久久久久久久久久9不雅视频| 久久久久久久香蕉网| 免费又黄又爽又猛大片午夜| 国产原创一区二区三区| 看高清中日韩色视频| 男女啪啪在线观看| 日韩欧美国产高清91| 亚洲一区二区偷拍| 精品久久国产| 98精品国产高清在线xxxx天堂| 亚洲天堂网在线观看视频| 粉嫩aⅴ一区二区三区四区五区| 免费精品视频一区| 肉体视频在线| 欧美日本在线播放| 中文字幕一区二区三区人妻电影| 久久精品一区二区不卡| 欧美在线视频免费播放| 国产chinasex对白videos麻豆| 国产日韩欧美一区二区三区综合| 日韩在线观看a| 伊人久久精品| 在线观看视频99| 欧美特黄aaaaaa| 大尺度一区二区| 亚洲天堂av免费在线观看| 91精品论坛| 亚洲国产成人精品久久久国产成人一区 | 亚洲青青青在线视频| 乱子伦视频在线看| 欧美大胆视频| 久久久伊人欧美| 精品久久国产视频| 成人欧美一区二区三区小说| 天天干在线影院| 亚洲精品亚洲人成在线| 69久久夜色精品国产69| 亚洲国产精品国自产拍久久| 亚洲欧美日本韩国| 欧美一级xxxx| 91欧美国产| 国产精自产拍久久久久久| 国产视频第一页在线观看| 欧美性生交xxxxxdddd| 成人精品在线观看视频| 99国产精品自拍| 久久er99热精品一区二区三区| 丁香花高清在线观看完整版| 日韩精品一区在线| 免费视频一二三区| 福利电影一区二区| 成人在线播放网址| 国产图片一区| 91sa在线看| 国产永久免费高清在线观看视频| 色婷婷av久久久久久久| 国产jk精品白丝av在线观看| 爽好久久久欧美精品| 日本黑人久久| 男女啪啪999亚洲精品| 日韩性xxxx爱| 国产丝袜视频在线观看| 一区二区三区高清在线| 亚洲色图欧美日韩| 国产美女一区| 视频一区二区综合| 欧美视频精品| 色综合色综合久久综合频道88| 亚洲精品97久久中文字幕| 亚洲成在线观看| 亚洲成人av免费在线观看| 欧美亚洲专区| 一本久道久久综合| 日韩精品久久久久久久软件91| 欧美极品少妇与黑人| 天天操天天干天天爱| 欧美日韩一区免费| 中文字幕有码在线播放| 精品一区中文字幕| 国产黄色片免费在线观看| 亚洲免费福利一区| 成人黄色免费片| 搞黄网站在线看| 亚洲一区二区久久| 国产人妻精品一区二区三| 夜夜揉揉日日人人青青一国产精品| 妖精视频一区二区| 日韩电影一区二区三区四区| 天堂v在线视频| 国产欧美自拍一区| 国产精品欧美亚洲777777| 在线中文免费视频| 亚洲免费精彩视频| 国产欧美第一页| 欧美日韩国产色| 成人做爰视频网站| 久久综合精品国产一区二区三区 | 亚洲综合久久网| 亚洲天堂精品视频| 亚洲av无码一区二区二三区| 韩国欧美国产一区| av天堂永久资源网| 欧美91大片| 日韩精品一线二线三线| 91蜜桃臀久久一区二区| 国产精品精品久久久| 久久青青色综合| 最近中文字幕日韩精品| 欧美一区,二区| 91.麻豆视频| www.久久久久久久| 亚洲国产精品一区二区www在线| 日韩免费成人av| 99视频热这里只有精品免费| xxxx在线免费观看| 久久一区二区三区四区五区| a级片一区二区| 日韩欧美伦理| 日本一区二区三区免费观看| xxxx日韩| 97视频资源在线观看| 日本黄色成人| 国产精品国产自产拍高清av水多| 啊啊啊久久久| 欧美激情欧美激情| 国产三级在线播放| 色狠狠av一区二区三区香蕉蜜桃| 深夜影院在线观看| 亚洲国产成人精品女人久久久| a天堂中文在线观看| 欧美三级韩国三级日本三斤| 无码人妻精品一区二区蜜桃色欲| 亚洲第一激情av| 国产在线视频第一页| 亚洲激情成人在线| 全程偷拍露脸中年夫妇| 国产精品久久久久久久久久免费看| 国产吞精囗交久久久| av在线播放一区二区三区| 欧美69精品久久久久久不卡| 精品一区二区久久| 色www免费视频| 青草av.久久免费一区| 国产精品少妇在线视频| 丝袜a∨在线一区二区三区不卡| 欧美国产亚洲一区| 国产亚洲一区在线| aa在线免费观看| 亚洲永久在线| 国产av无码专区亚洲精品| 一本综合久久| 日本毛片在线免费观看| 性一交一乱一区二区洋洋av| 亚洲国产精品久久久久婷蜜芽| 中文一区二区| 国产综合免费视频| 玖玖玖国产精品| 成人性生生活性生交12| 日本麻豆一区二区三区视频| 无人在线观看的免费高清视频| 日韩国产精品久久| 男女视频在线看| 久久99精品国产麻豆婷婷| 在线视频一二区| 成人精品视频网站| 久久久无码人妻精品一区| 久久久高清一区二区三区| www.99热| 亚洲精品国产一区二区三区四区在线| 青青操视频在线播放| 亚洲一级二级在线| 中文字幕黄色片| 欧美色综合网站| 999久久久久久| 亚洲电影免费观看高清完整版在线| 亚洲aaaaaaa| 中文字幕av一区二区| 91黄色在线| 欧美一级高清免费播放| 国产91在线播放精品| 91传媒免费看| 欧洲精品一区| 亚洲在线色站| 激情欧美国产欧美| 激情网站五月天| 国产一区亚洲一区| 内射中出日韩无国产剧情| 欧美激情一区二区三区四区| 精品无码久久久久成人漫画 | 波多野结衣大片| 91精品国产全国免费观看| 午夜在线观看视频18| 中文字幕一区二区精品| 久草成色在线| 国产精品尤物福利片在线观看| 日本一区影院| 日韩av电影免费在线| 你懂的亚洲视频| 麻豆av免费在线| 国产精品中文字幕日韩精品| 国产传媒第一页| 亚洲精选在线视频| 国产美女www| 亚洲精品在线观| 日本最新在线视频| 欧美主播福利视频| 日韩在线观看中文字幕| 日韩精品久久一区| 禁久久精品乱码| 国产成人在线综合| 久久婷婷成人综合色| 69av.com| 欧美日韩国产成人在线免费| 日韩欧美电影在线观看| 久久国产精彩视频| 欧美日韩国产网站| 国产在线一区二区三区四区| 国产精品精品| 亚洲精品高清无码视频| 成人ar影院免费观看视频| 黑人狂躁日本娇小| 91福利视频在线| 先锋av资源站| 久久久爽爽爽美女图片| 国产精品久久久久久久久久辛辛 | 在线观看av中文字幕| 亚洲激情图片一区| 国产精品国产三级国产aⅴ| 亚洲色图日韩av| 国产无遮挡裸体视频在线观看| 亚洲自拍偷拍一区| 久久视频国产| 奇米影音第四色| 久久久久高清精品| 国产精品男女视频| 日韩av网站在线| 波多野结衣在线高清| av蓝导航精品导航| 综合亚洲视频| 成人三级做爰av| 一区二区三区欧美亚洲| 国产欧美日韩成人| 操人视频在线观看欧美| 亚洲欧洲一二区| 一区二区三区四区五区精品| 免费在线观看日韩欧美| 一区二区三区伦理片| 色一情一伦一子一伦一区| 欧美色18zzzzxxxxx| 91av在线影院| 国内成人精品| 久久久久国产精品熟女影院| 久久免费精品国产久精品久久久久 | √新版天堂资源在线资源| 国产精品高潮呻吟久久av野狼| 免费精品国产| 在线免费视频a| 国产精品国产精品国产专区不片| 一级久久久久久久| 久久这里有精品视频| 香蕉免费一区二区三区在线观看| 国风产精品一区二区| 成人国产精品免费网站| 日韩精品人妻中文字幕| 亚洲欧洲在线播放| 欧美成a人片免费观看久久五月天| 亚洲乱码国产乱码精品天美传媒| 久久精品国产在热久久| 青娱乐91视频| 日韩精品视频在线免费观看| 亚洲一二三四| 一区不卡字幕| 成人av在线资源网站| 精品欧美一区二区三区免费观看| 亚洲人成在线免费观看| av在线成人| 欧美午夜小视频| 国产亚洲午夜高清国产拍精品 | 400部精品国偷自产在线观看| 粉嫩aⅴ一区二区三区四区五区| 久久一区二区三区视频| 中文国产亚洲喷潮| 日本综合精品一区| 国产极品美女高潮无套久久久| 国产精品视频第一区| 国产ts变态重口人妖hd| 51精品在线观看| 91精品一区二区三区综合| 欧美大喷水吹潮合集在线观看| 色94色欧美sute亚洲线路一ni| 欧美激情视频在线播放| 国产在线一区二区三区四区| 奇米一区二区三区av| 国产一级做a爱免费视频| 在线观看国产成人av片| 国产精品高潮呻吟久久久久| 国产视频一区二区三区在线播放| 亚洲丝袜自拍清纯另类| 日韩三级电影网| 2014亚洲精品| 免费欧美在线视频| 国产无遮挡裸体免费视频| 中文字幕av一区| 欧美影院天天5g天天爽| 在线免费看污网站| 色婷婷精品久久二区二区蜜臀av| av毛片在线| 午夜精品区一区二区三| 成人av网站在线| 999免费视频| 国产精品电影久久久久电影网| 雨宫琴音一区二区在线|