Volley
具有AsyncHttpClient(Http通信)和Universal-Image-Loader(加載網(wǎng)絡(luò)圖片)的優(yōu)點,適用于數(shù)據(jù)量不大缨恒,但通信頻繁的場景,這個類庫在網(wǎng)絡(luò)連接上做的比較好,圖片處理不夠強(qiáng)大(例如說處理圓角等處理)
基本用法:
1. 創(chuàng)建一個RequestQueue對象。(Volley.newRequestQueue(context));
2. 創(chuàng)建一個Request對象年缎。(StringRequest癌别、JsonRequest皂岔、ImageRequest)
3. 將Request對象添加到RequestQueue里面。
Volley中的ImageLoader:
1.創(chuàng)建一個RequestQueue對象
2.創(chuàng)建一個ImageLoader對象
3.獲取一個ImageListener對象
4. 調(diào)用ImageLoader的get()方法加載網(wǎng)絡(luò)上的圖片
可自定義一個類實現(xiàn)ImageCache接口展姐,重寫getBitmap和putBitmap,利用LruCache來進(jìn)行緩存
ImageLoader要比ImageRequest更加高效躁垛,不僅可以對圖片進(jìn)行緩存,還可以過濾掉重復(fù)的鏈接圾笨,避免重復(fù)發(fā)送請求教馆。
Volley中的NetworkImageView:
1. 創(chuàng)建一個RequestQueue對象。
2. 創(chuàng)建一個ImageLoader對象擂达。
3. 在布局文件中添加一個NetworkImageView控件土铺。
4. 在代碼中獲取該控件的實例。
5. 設(shè)置要加載的圖片地址板鬓。 這是一個控件悲敷,會自動獲取自身的寬高,壓縮自動化 下午將查看源碼俭令,了解其原理
創(chuàng)建一個RequestQueue對象時后德,首先其內(nèi)部會根據(jù)手機(jī)系統(tǒng)版本號是否大于9來選擇訪問網(wǎng)絡(luò)的方式,大于9選擇HttpUrlConnection唤蔗,否則選擇HttpClient,然后再來RequestQueue.start().而start()的工作內(nèi)容就是創(chuàng)建一個CacheDispatcher緩存線程和默認(rèn)四個NetworkDispatcher網(wǎng)絡(luò)請求線程探遵。
add()時,判斷當(dāng)前的請求是否可以緩存妓柜,如果不能緩存則直接將這條請求加入網(wǎng)絡(luò)請求隊列箱季,可以緩存的話則將這條請求加入緩存隊列。
默認(rèn)每條請求都是可以緩存的棍掐,自然就被添加到了緩存隊列中藏雏。根據(jù)網(wǎng)上的資料以及自己的理解大概就是這樣,具體怎么請求和怎么緩存沒去深究
Picasso的優(yōu)點:
1.處理Adapter中的 ImageView 回收和取消已經(jīng)回收ImageView的下載進(jìn)程
2.使用最少的內(nèi)存完成復(fù)雜的圖片轉(zhuǎn)換作煌,比如把下載的圖片轉(zhuǎn)換為圓角等掘殴,提供了接口來讓用戶可以自定義轉(zhuǎn)換操作
3.自動的內(nèi)存和硬盤緩存;
缺點:
1.沒有緩存過期
2.沒有生成thumbnails---android系統(tǒng)中相機(jī)和圖片的緩存文件
3.無法關(guān)心下載過程
使用:
Picasso.with(context) .load(url).resize(50, 50).centerCrop().into(imageView)
with的時候會執(zhí)行new Builder(context).build();
1.首先會使用OkHttp來實例一個downloader(HttpClient或者HttpUrlConnection)
2.再new LruCache(context);緩存
3.創(chuàng)建一個線程池ExecutorService粟誓,wifi下線程個數(shù)是4奏寨,4G是3,3G是2鹰服,2G是1病瞳。
4.創(chuàng)建了RequestTransformer對象揽咕,處理圖片大小圓角角度等。
在load()時創(chuàng)建Request(圖形操作的類)套菜,在into()中創(chuàng)建action(主要用于圖片加載后的回調(diào)亲善,有兩個回調(diào)方法complete和error)、bitmapHunter(一個Runnable,用于子類實現(xiàn)不同類型資源解析)逗柴,并最終交(Bitmap)給dispatcher執(zhí)行蛹头。
Universal-Image-Loader的優(yōu)點:
1. 多線程下載圖片,圖片可以來源于網(wǎng)絡(luò)戏溺,文件系統(tǒng)渣蜗,項目文件夾assets中以及drawable中等
2. 支持隨意的配置ImageLoader,例如線程池旷祸,圖片下載器袍睡,內(nèi)存緩存策略,硬盤緩存策略肋僧,圖片顯示選項以及其他的一些配置
3. 支持圖片的內(nèi)存緩存,文件系統(tǒng)緩存或者SD卡緩存
4.支持圖片下載過程的監(jiān)聽
5. 根據(jù)控件(ImageView)的大小對Bitmap進(jìn)行裁剪控淡,減少Bitmap占用過多的內(nèi)存
6.較好的控制圖片的加載過程嫌吠,例如暫停圖片加載,重新開始加載圖片掺炭,一般使用在ListView,GridView中辫诅,滑動過程中暫停加載圖片,停止滑動的時候去加載圖片
7. 提供在較慢的網(wǎng)絡(luò)下對圖片進(jìn)行加載
Universal-Image-Loader:在自定義的Application中涧狮,實現(xiàn)ImageLoaderConfiguration類來配置剛第二條的配置炕矮。可執(zhí)行ImageLoaderConfiguration .createDefault(this)者冤,來創(chuàng)建一個默認(rèn)的配置;
Universal-Image-Loader提供了displayImage(), loadImage(),loadImageSync()三種加載方法肤视,第三種方法是同步的,所以4.0以后不適用涉枫。第二種loadImage()主要提供監(jiān)聽loading開始邢滑,loading失敗,loading完成愿汰,loading取消困后。
displayImage()方法中提供ImageLoadingProgressListener接口,監(jiān)聽圖片下載過程
UIL提供了強(qiáng)引用緩存 衬廷、強(qiáng)引用和弱引用相結(jié)合的緩存摇予、弱引用緩存的幾種內(nèi)存緩存策略,提供了UnlimitedDiscCache(沒任何限制)吗跋,LruDiscCache等的硬盤緩存策略侧戴,在Application配置就可以了;
利用ReentrantLock解決重復(fù)的去從網(wǎng)絡(luò)上面請求圖片