MessageQueue:就是一個(gè)消息隊(duì)列蔓肯,可以添加消息卿叽,并處理消息
Hanlder內(nèi)部會(huì)跟Looper進(jìn)行關(guān)聯(lián)彤断,也就是說在Handler的內(nèi)部可以找到Looper漱贱,找到了Looper也就找到了MessageQueue在Hanler中發(fā)送消息峡钓,其實(shí)就是先MessageQueue隊(duì)列中發(fā)送消息
總結(jié):Hanlder負(fù)責(zé)發(fā)送消息妓笙,Looper負(fù)責(zé)接收handler發(fā)送的消息,并直接把消息回傳到handler自己
MessageQueue就是一個(gè)存儲(chǔ)消息的容器
Volley框架的使用
1.Volley的get和post請(qǐng)求方式的使用
挑選合適的請(qǐng)求對(duì)象:(返回?cái)?shù)據(jù)的類型)
StringRequest(主要請(qǐng)求不確定)
JsonObjectRequest(返回解析的數(shù)據(jù)是jsonObject)
JsonArrayRequest(返回解析的數(shù)據(jù)是JsonArray)
回調(diào)的使用
2.Volley的網(wǎng)絡(luò)請(qǐng)求隊(duì)列建立和取消隊(duì)列的請(qǐng)求
建立全局請(qǐng)求隊(duì)列
方面取消某個(gè)請(qǐng)求
3.Volley與Activity生命周期的聯(lián)動(dòng)
特點(diǎn)
可以在Activity銷毀的時(shí)候,同時(shí)關(guān)閉請(qǐng)求
關(guān)鍵點(diǎn)
設(shè)置Tag標(biāo)簽能岩,onStop()里面執(zhí)行取消請(qǐng)求
Volley的簡(jiǎn)單的二次回調(diào)封裝
請(qǐng)求成功請(qǐng)求失敗的回調(diào)封裝
優(yōu)勢(shì)
全局使用一個(gè)方式寞宫,可控,可自定義定制需求
方便靈活
OkHttp
https://blog.csdn.net/jiankeufo/article/details/54880588
1.占用儲(chǔ)存空間
????使用OkHttp需要 okio.jar (80k), okhttp.jar(330k)這2個(gè)jar包拉鹃,總大小差不多400k,加上自己的封裝辈赋,差不多得410k。
2.功能介紹
????Square 公司開源的 OkHttp 是一個(gè)專注于連接效率的 HTTP 客戶端膏燕。OkHttp 提供了對(duì) HTTP/2 和 SPDY 的支持钥屈,并提供了連接池,GZIP 壓縮和 HTTP 響應(yīng)緩存功能坝辫。
3.優(yōu)點(diǎn)
????支持http請(qǐng)求篷就,https請(qǐng)求。
????支持文件下載近忙。
????使用的是HttpURLConnection,不要擔(dān)心android版本的變換竭业。(至少目前是都支持的)智润。
????支持get,post請(qǐng)求未辆。
????基于Http的文件上傳窟绷。
????加載圖片。
4.缺點(diǎn)
????比如callback回來是在線程里面, 不能刷新UI咐柜,需要我們手動(dòng)處理兼蜈。
????封裝比較麻煩。
Volley
1.占用儲(chǔ)存空間
????使用Volley 需要Volley.jar(120k)炕桨,加上自己的封裝最多140k饭尝。
2.功能介紹
? Volley是Goole在2013年Google I/O大會(huì)上推出了一個(gè)新的網(wǎng)絡(luò)通信框架,它是開源的献宫。
? ?Volley 的特點(diǎn):特別適合數(shù)據(jù)量小钥平,通信頻繁的網(wǎng)絡(luò)操作。
3.優(yōu)點(diǎn)
????非常適合進(jìn)行數(shù)據(jù)量不大姊途,但通信頻繁的網(wǎng)絡(luò)操作涉瘾。
????內(nèi)部分裝了異步線程。
????支持get捷兰,post網(wǎng)絡(luò)請(qǐng)求立叛。
????圖片下載。
????可直接在主線程調(diào)用服務(wù)端并處理返回結(jié)果贡茅。
????可以取消請(qǐng)求秘蛇,容易擴(kuò)展,面向接口編程顶考。
4.缺點(diǎn)
????對(duì)大文件下載 Volley的表現(xiàn)非常糟糕赁还。
????只支持http請(qǐng)求。
????在BasicNetwork中判斷了statusCode(statusCode < 200 || statusCode > 299)驹沿,如果符合條件直
????接圖片加載艘策,性能一般。
????使用的是httpclient渊季,HttpURLConnection贰逾。不過在android 6.0不支持httpclient了纵柿,如果想支持得添加org.apache.http.legacy.jar免都。
總結(jié)
在我們平時(shí)的項(xiàng)目使用volley就可以了食侮,相對(duì)okhttp,volley非常穩(wěn)定合砂。Okhttp一般混合來用青扔,能夠勝任相對(duì)復(fù)雜的需求。如今,在AndroidStudio中赎懦,網(wǎng)絡(luò)請(qǐng)求還是推薦使用Retrofit2+okhttp。
Retrofit2+okHttp3這個(gè)目前較為流行網(wǎng)絡(luò)框架
四種常用的圖片加載框架幻工,分別是Fresco励两、ImageLoader、 Picasso囊颅、 Glide当悔,包括他們各自的優(yōu)缺點(diǎn)、使用步驟等等
http://www.jb51.net/article/100093.htm
?首先看 Fresco, Fresco 是 Facebook 推出的開源圖片緩存工具踢代,主要特點(diǎn)包括:兩個(gè)內(nèi)存緩存加上 Native 緩存構(gòu)成了三級(jí)緩存盲憎,支持流式,可以類似網(wǎng)頁上模糊漸進(jìn)式顯示圖片胳挎,對(duì)多幀動(dòng)畫圖片支持更好饼疙,如 Gif、WebP慕爬。它的優(yōu)點(diǎn)是其他幾個(gè)框架沒有的, 或者說是其他幾個(gè)框架的短板窑眯。
????? 優(yōu)點(diǎn):
???????? 1. 圖片存儲(chǔ)在安卓系統(tǒng)的匿名共享內(nèi)存, 而不是虛擬機(jī)的堆內(nèi)存中, 圖片的中間緩沖數(shù)據(jù)也存放在本地堆內(nèi)存, 所以, 應(yīng)用程序有更多的內(nèi)存使用, 不會(huì)因?yàn)閳D片加載而導(dǎo)致oom, 同時(shí)也減少垃圾回收器頻繁調(diào)用回收 Bitmap 導(dǎo)致的界面卡頓, 性能更高。???????? 2. 漸進(jìn)式加載 JPEG 圖片, 支持圖片從模糊到清晰加載医窿。???????? 3. 圖片可以以任意的中心點(diǎn)顯示在 ImageView, 而不僅僅是圖片的中心磅甩。???????? 4. JPEG 圖片改變大小也是在 native 進(jìn)行的, 不是在虛擬機(jī)的堆內(nèi)存, 同樣減少 OOM。???????? 5. 很好的支持 GIF 圖片的顯示姥卢。
??? 缺點(diǎn):
???????? 1. 框架較大, 影響 Apk 體積???????? 2. 使用較繁瑣
?ImageLoader是比較老的框架,是github社區(qū)上star最多的一個(gè)項(xiàng)目,可以理解為點(diǎn)贊最多滴,應(yīng)該是最有名的一個(gè)國(guó)內(nèi)很多知名軟件都用它包括淘寶京東聚劃算等等卷要。整個(gè)庫分為 ImageLoaderEngine,Cache 及 ImageDownloader独榴,ImageDecoder僧叉,BitmapDisplayer,BitmapProcessor 五大模塊括眠,其中 Cache 分為 MemoryCache 和 DiskCache 兩部分彪标。簡(jiǎn)單的講就是 ImageLoader 收到加載及顯示圖片的任務(wù),并將它交給 ImageLoaderEngine掷豺,ImageLoaderEngine 分發(fā)任務(wù)到具體線程池去執(zhí)行捞烟,任務(wù)通過 Cache 及 ImageDownloader 獲取圖片,中間可能經(jīng)過 BitmapProcessor 和 ImageDecoder 處理当船,最終轉(zhuǎn)換為Bitmap 交給 BitmapDisplayer 在 ImageAware中顯示题画。特點(diǎn)是穩(wěn)定, 加載速度適中, 缺點(diǎn)在于不支持GIF圖片加載, 使用稍微繁瑣, 并且緩存機(jī)制沒有和 http 的緩存很好的結(jié)合, 完全是自己的一套緩存機(jī)制。使用比較簡(jiǎn)單,這個(gè)框架的github主頁上也有快速使用的步驟德频,基本上就是在application類里的oncreate方法(整個(gè)程序開始時(shí)運(yùn)行一次)中進(jìn)行一下簡(jiǎn)單的基本配置,可以根據(jù)需要自行進(jìn)行設(shè)定,懶得設(shè)定的話框架也提供了一個(gè)默認(rèn)的配置,調(diào)用一個(gè)方法即可苍息。基本上是配置一些類似于:緩存類型啊,緩存上限值啊,加載圖片的線程池?cái)?shù)量啊等等。此外在頁面內(nèi)顯示的時(shí)候還要設(shè)置一個(gè)顯示配置這個(gè)配置不同于基本配置,一個(gè)項(xiàng)目里可以根據(jù)需要?jiǎng)?chuàng)建多個(gè)配置對(duì)象使用,這個(gè)配置就比較具體了,可以設(shè)置是否使用disk緩存(存到sd卡里一般),加載圖片失敗時(shí)顯示的圖片,默認(rèn)圖片,圖片的色彩樣式等竞思。ImageLoader和Volley圖片部分還包括其他大部分圖片框架,基本上圖片處理都差不多,區(qū)別僅在于部分優(yōu)化了,而優(yōu)化方面UIL即Universal-Image-Loader框架做的最好,配置好以后,就是簡(jiǎn)單的使用了,創(chuàng)建一個(gè)圖片加載對(duì)象,然后一行代碼搞定顯示圖片功能表谊。參數(shù)一般是入你需要顯示的圖片url和imageview對(duì)象。
???? 優(yōu)點(diǎn):
?????? 1.支持下載進(jìn)度監(jiān)聽?????? 2.可以在 View 滾動(dòng)中暫停圖片加載盖喷,通過 PauseOnScrollListener 接口可以在 View 滾動(dòng)中暫停圖片加載爆办。?????? 3.默認(rèn)實(shí)現(xiàn)多種內(nèi)存緩存算法 這幾個(gè)圖片緩存都可以配置緩存算法,不過 ImageLoader 默認(rèn)實(shí)現(xiàn)了較多緩存算法课梳,如 Size 最大先刪除距辆、使用最少先刪除、最近最少使用暮刃、先進(jìn)先刪除跨算、時(shí)間最長(zhǎng)先刪除等。?????? 4.支持本地緩存文件名規(guī)則定義
???? 4. 提供了豐富的緩存策略?
???????? 內(nèi)存緩存椭懊,現(xiàn)在我們來看Universal-Image-Loader有哪些內(nèi)存緩存策略
??????? 1. 只使用的是強(qiáng)引用緩存???????????? LruMemoryCache(這個(gè)類就是這個(gè)開源框架默認(rèn)的內(nèi)存緩存類诸蚕,緩存的是bitmap的強(qiáng)引用,下面我會(huì)從源碼上面分析這個(gè)類)
??????? 2.使用強(qiáng)引用和弱引用相結(jié)合的緩存有
?????????? UsingFreqLimitedMemoryCache(如果緩存的圖片總量超過限定值氧猬,先刪除使用頻率最小的bitmap)?????????? LRULimitedMemoryCache(這個(gè)也是使用的lru算法挫望,和LruMemoryCache不同的是,他緩存的是bitmap的弱引用)?????????? FIFOLimitedMemoryCache(先進(jìn)先出的緩存策略狂窑,當(dāng)超過設(shè)定值媳板,先刪除最先加入緩存的bitmap)?????????? LargestLimitedMemoryCache(當(dāng)超過緩存限定值,先刪除最大的bitmap對(duì)象)?????????? LimitedAgeMemoryCache(當(dāng) bitmap加入緩存中的時(shí)間超過我們?cè)O(shè)定的值泉哈,將其刪除)
??????? 3.只使用弱引用緩存
?????????? WeakMemoryCache(這個(gè)類緩存bitmap的總大小沒有限制蛉幸,唯一不足的地方就是不穩(wěn)定,緩存的圖片容易被回收硬盤緩存)?????????? FileCountLimitedDiscCache(可以設(shè)定緩存圖片的個(gè)數(shù)丛晦,當(dāng)超過設(shè)定值奕纫,刪除掉最先加入到硬盤的文件)?????????? LimitedAgeDiscCache(設(shè)定文件存活的最長(zhǎng)時(shí)間,當(dāng)超過這個(gè)值烫沙,就刪除該文件)?????????? TotalSizeLimitedDiscCache(設(shè)定緩存bitmap的最大值匹层,當(dāng)超過這個(gè)值,刪除最先加入到硬盤的文件)?????????? UnlimitedDiscCache(這個(gè)緩存類沒有任何的限制)
??????? Picasso 是 Square 開源的項(xiàng)目锌蓄,且他的主導(dǎo)者是 JakeWharton升筏,所以廣為人知。square公司,很多知名的開源也是該公司`android-times-square,leakcanary,okhttp,retrofit`瘸爽。 Picasso的使用方便, 一行代碼完成加載圖片并顯示, 框架體積小您访。但是不支持 GIF, 并且它可能是想讓服務(wù)器去處理圖片的縮放, 它緩存的圖片是未縮放的, 并且默認(rèn)使用 ARGB_8888 格式緩存圖片, 緩存體積大。整個(gè)庫分為 Dispatcher剪决,RequestHandler 及 Downloader灵汪,PicassoDrawable 等模塊檀训。Dispatcher 負(fù)責(zé)分發(fā)和處理 Action,包括提交享言、暫停峻凫、繼續(xù)、取消览露、網(wǎng)絡(luò)狀態(tài)變化蔚晨、重試等等。簡(jiǎn)單的講就是 Picasso 收到加載及顯示圖片的任務(wù)肛循,創(chuàng)建 Request 并將它交給 Dispatcher,Dispatcher 分發(fā)任務(wù)到具體 RequestHandler银择,任務(wù)通過 MemoryCache 及 Handler(數(shù)據(jù)獲取接口) 獲取圖片多糠,圖片獲取成功后通過 PicassoDrawable 顯示到 Target 中。需要注意的是上面 Data 的 File system 部分浩考,Picasso 沒有自定義本地緩存的接口夹孔,默認(rèn)使用 http 的本地緩存,API 9 以上使用 okhttp析孽,以下使用 Urlconnection搭伤,所以如果需要自定義本地緩存就需要重定義 Downloader。
?????? Picasso 優(yōu)點(diǎn)
??????? 1.自帶統(tǒng)計(jì)監(jiān)控功能袜瞬。支持圖片緩存使用的監(jiān)控怜俐,包括緩存命中率、已使用內(nèi)存大小邓尤、節(jié)省的流量等拍鲤。??????? 2.支持優(yōu)先級(jí)處理。每次任務(wù)調(diào)度前會(huì)選擇優(yōu)先級(jí)高的任務(wù)汞扎,比如 App 頁面中 Banner 的優(yōu)先級(jí)高于 Icon 時(shí)就很適用季稳。??????? 3.支持延遲到圖片尺寸計(jì)算完成加載??????? 4.支持飛行模式、并發(fā)線程數(shù)根據(jù)網(wǎng)絡(luò)類型而變澈魄。 手機(jī)切換到飛行模式或網(wǎng)絡(luò)類型變換時(shí)會(huì)自動(dòng)調(diào)整線程池最大并發(fā)數(shù)景鼠,比如 wifi 最大并發(fā)為 4,4g 為 3痹扇,3g 為 2铛漓。? 這里 Picasso 根據(jù)網(wǎng)絡(luò)類型來決定最大并發(fā)數(shù),而不是 CPU 核數(shù)鲫构。??????? 5.“無”本地緩存票渠。無”本地緩存,不是說沒有本地緩存芬迄,而是 Picasso 自己沒有實(shí)現(xiàn)问顷,交給了 Square 的另外一個(gè)網(wǎng)絡(luò)庫 okhttp 去實(shí)現(xiàn),這樣的好處是可以通過請(qǐng)求 Response Header 中的 Cache-Control 及 Expired 控制圖片的過期時(shí)間。
Glide可以說是 Picasso 的升級(jí)版, 有 Picasso 的優(yōu)點(diǎn), 并且支持 GIF 圖片加載顯示, 圖片緩存也會(huì)自動(dòng)縮放, 默認(rèn)使用 RGB_565 格式緩存圖片, 是 Picasso 緩存體積的一半杜窄。谷歌為我們介紹了一個(gè)名叫 Glide 的圖片加載庫肠骆,作者是`bumptech`。這個(gè)庫被廣泛的運(yùn)用在google的開源項(xiàng)目中塞耕,包括2014年google I/O大會(huì)上發(fā)布的官方app蚀腿。整個(gè)庫分為 RequestManager(請(qǐng)求管理器),Engine(數(shù)據(jù)獲取引擎)扫外、 Fetcher(數(shù)據(jù)獲取器)莉钙、MemoryCache(內(nèi)存緩存)、DiskLRUCache筛谚、Transformation(圖片處理)磁玉、Encoder(本地緩存存儲(chǔ))、Registry(圖片類型及解析器配置)驾讲、Target(目標(biāo)) 等模塊蚊伞。簡(jiǎn)單的講就是Glide 收到加載及顯示資源的任務(wù),創(chuàng)建 Request 并將它交給RequestManager吮铭,Request 啟動(dòng) Engine 去數(shù)據(jù)源獲取資源(通過 Fetcher )时迫,獲取到后 Transformation 處理后交給 Target。Glide 依賴于 DiskLRUCache谓晌、GifDecoder 等開源庫去完成本地緩存和 Gif 圖片解碼工作掠拳。
???? Glide 優(yōu)點(diǎn)
不僅僅可以進(jìn)行圖片緩存還可以緩存媒體文件。Glide 不僅是一個(gè)圖片緩存纸肉,它支持 Gif碳想、WebP、縮略圖毁靶。甚至是 Video胧奔,所以更該當(dāng)做一個(gè)媒體緩存。 ? ? ? ?2.支持優(yōu)先級(jí)處理预吆。??????? 3.與 Activity/Fragment 生命周期一致龙填,支持 trimMemory。Glide 對(duì)每個(gè) context 都保持一個(gè) RequestManager拐叉,通過 FragmentTransaction 保持與 Activity/Fragment 生命周期一致岩遗,并且有對(duì)應(yīng)的 trimMemory 接口實(shí)現(xiàn)可供調(diào)用。??????? 4.支持 okhttp凤瘦、Volley宿礁。Glide 默認(rèn)通過 UrlConnection 獲取數(shù)據(jù),可以配合 okhttp 或是 Volley 使用蔬芥。實(shí)際 ImageLoader梆靖、Picasso 也都支持 okhttp控汉、Volley。??????? 5.內(nèi)存友好返吻。Glide 的內(nèi)存緩存有個(gè) active 的設(shè)計(jì)姑子,從內(nèi)存緩存中取數(shù)據(jù)時(shí),不像一般的實(shí)現(xiàn)用 get测僵,而是用 remove街佑,再將這個(gè)緩存數(shù)據(jù)放到一個(gè) value 為軟引用的 activeResources map 中,并計(jì)數(shù)引用數(shù)捍靠,在圖片加載完成后進(jìn)行判斷沐旨,如果引用計(jì)數(shù)為空則回收掉。內(nèi)存緩存更小圖片榨婆,Glide 以 url磁携、view_width、view_height纲辽、屏幕的分辨率等做為聯(lián)合 key,將處理后的圖片緩存在內(nèi)存緩存中璃搜,而不是原始圖片以節(jié)省大小與 Activity/Fragment 生命周期一致拖吼,支持 trimMemory。圖片默認(rèn)使用默認(rèn)RGB_565 而不是 ARGB_888这吻,雖然清晰度差些吊档,但圖片更小,也可配置到 ARGB_888唾糯。???????? 6.Glide 可以通過 signature 或不使用本地緩存支持 url 過期
Android --- 簡(jiǎn)單實(shí)現(xiàn)三級(jí)緩存
為什么要進(jìn)行三級(jí)緩存
三級(jí)緩存策略怠硼,最實(shí)在的意義就是減少不必要的流量消耗,增加加載速度移怯。
?三級(jí)緩存的原理
首次加載的時(shí)候通過網(wǎng)絡(luò)加載香璃,獲取圖片,然后保存到內(nèi)存和SD 卡中舟误。
之后運(yùn)行APP 時(shí)葡秒,優(yōu)先訪問內(nèi)存中的圖片緩存。
如果內(nèi)存沒有嵌溢,則加載本地SD 卡中的圖片眯牧。
?三級(jí)緩存:
1、網(wǎng)絡(luò)緩存 從網(wǎng)絡(luò)獲取資源(異步加載)
2赖草、本地緩存 從本地獲取數(shù)據(jù)(File存儲(chǔ))
3学少、內(nèi)存緩存 從內(nèi)存獲取數(shù)據(jù)(LruCache)
輕量級(jí)緩存框架——ACache(ASimpleCache)
ACache介紹:
ACache類似于SharedPreferences,但是比SharedPreferences功能更加強(qiáng)大秧骑,SharedPreferences只能保存一些基本數(shù)據(jù)類型版确、Serializable扣囊、Bundle等數(shù)據(jù),
而Acache可以緩存如下數(shù)據(jù):
普通的字符串阀坏、JsonObject如暖、JsonArray、Bitmap忌堂、Drawable盒至、序列化的java對(duì)象,和 byte數(shù)據(jù)士修。
主要特色:
1:輕枷遂,輕到只有一個(gè)JAVA文件。
2:可配置棋嘲,可以配置緩存路徑酒唉,緩存大小,緩存數(shù)量等沸移。
3:可以設(shè)置緩存超時(shí)時(shí)間痪伦,緩存超時(shí)自動(dòng)失效,并被刪除雹锣。
4:支持多進(jìn)程网沾。
應(yīng)用場(chǎng)景:
1、替換SharePreference當(dāng)做配置文件
2蕊爵、可以緩存網(wǎng)絡(luò)請(qǐng)求數(shù)據(jù)辉哥,比如oschina的android客戶端可以緩存http請(qǐng)求的新聞內(nèi)容,緩存時(shí)間假設(shè)為1個(gè)小時(shí)攒射,超時(shí)后自動(dòng)失效醋旦,讓客戶端重新請(qǐng)求新的數(shù)據(jù),減少客戶端流量会放,同時(shí)減少服務(wù)器并發(fā)量饲齐。
下載鏈接:https://github.com/yangfuhai/ASimpleCache
框架分析:http://blog.csdn.net/zhoubin1992/article/details/46379055
Android緩存分為內(nèi)存緩存和文件緩存(磁盤緩存)咧最。在早期箩张,各大圖片緩存框架流行之前,常用的內(nèi)存緩存方式是軟引用(SoftReference)和弱引用(WeakReference)窗市,如大部分的使用方式:HashMap> imageCache;這種形式先慷。從Android 2.3(Level 9)開始,垃圾回收器更傾向于回收SoftReference或WeakReference對(duì)象咨察,這使得SoftReference和WeakReference變得不是那么實(shí)用有效论熙。同時(shí),到了Android 3.0(Level 11)之后摄狱,圖片數(shù)據(jù)Bitmap被放置到了內(nèi)存的堆區(qū)域脓诡,而堆區(qū)域的內(nèi)存是由GC管理的无午,開發(fā)者也就不需要進(jìn)行圖片資源的釋放工作,但這也使得圖片數(shù)據(jù)的釋放無法預(yù)知祝谚,增加了造成OOM的可能宪迟。因此,在Android3.1以后交惯,Android推出了LruCache這個(gè)內(nèi)存緩存類次泽,LruCache中的對(duì)象是強(qiáng)引用的。