最常用的圖片加載框架是:Gilde,F(xiàn)resco,Picasso。Fresco是Facebook提供的開(kāi)源圖片加載庫(kù),它能夠從網(wǎng)絡(luò),本地存儲(chǔ)和Android資源文件中加載圖片,且具有三級(jí)緩存設(shè)計(jì)(2級(jí)內(nèi)存,1級(jí)文件)。
兩者的使用很相似,但是也有很大的區(qū)別:
首先:
Glide加載的圖片沒(méi)有Picasso那么平滑
Picasso的內(nèi)存開(kāi)銷遠(yuǎn)大于Glide,Picasso是加載了全尺寸的圖片到內(nèi)存,然后讓GPU來(lái)實(shí)時(shí)重繪大小。而Glide加載的大小和ImageView的大小是一致的,因此更小,雖然內(nèi)存開(kāi)銷差距不大,但是在這個(gè)問(wèn)題上Glide完勝Picasso。因?yàn)镚lide可以自動(dòng)計(jì)算出任意情況下的ImageView大小。
Picasso和Glide在磁盤緩存策略上有很大的不同。Picasso緩存的是全尺寸的,而Glide緩存的是跟ImageView尺寸相同的
嘗試將ImageView調(diào)整成不同大小,但不管大小如何Picasso只緩存一個(gè)全尺寸的。Glide則不同,它會(huì)為每種大小的ImageView緩存一次。盡管一張圖片已經(jīng)緩存了一次,但是假如你要在另外一個(gè)地方再次以不同尺寸顯示,需要重新下載,調(diào)整成新尺寸的大小,然后將這個(gè)尺寸的也緩存起來(lái)
Glide的這種方式優(yōu)點(diǎn)是加載顯示非???。而Picasso的方式則因?yàn)樾枰陲@示之前重新調(diào)整大小而導(dǎo)致一些延遲,即便你添加了這段代碼來(lái)讓
對(duì)我而言,我更喜歡Glide,因?yàn)樗h(yuǎn)比Picasso快,雖然需要更大的空間來(lái)緩存
Glide 簡(jiǎn)介
Glide是一個(gè)快速高效的Android圖片加載庫(kù),注重于平滑的滾動(dòng)。Glide提供了易用的API,高性能、可擴(kuò)展的圖片解碼管道(decode pipeline),以及自動(dòng)的資源池技術(shù)。
Glide 支持拉取,解碼和展示視頻快照,圖片,和GIF動(dòng)畫(huà)。Glide的Api是如此的靈活,開(kāi)發(fā)者甚至可以插入和替換成自己喜愛(ài)的任何網(wǎng)絡(luò)請(qǐng)求框架。
默認(rèn)情況下,Glide使用的是一個(gè)定制化的基于 HttpUrlConnection 的棧,但同時(shí)也提供了與 Google Volley 和 Square OkHttp 快速集成的工具庫(kù)。
雖然Glide 的主要目標(biāo)是讓任何形式的圖片列表的滾動(dòng)盡可能地變得更快、更平滑,但實(shí)際上,Glide幾乎能滿足你對(duì)遠(yuǎn)程圖片的拉取/縮放/顯示的一切需求。
2,glide的使用
1、導(dǎo)入依賴
implementation 'com.github.bumptech.glide:glide:4.9.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
2、添加權(quán)限
<uses-permission android:name="android.permission.INTERNET"/>
<!--
Allows Glide to monitor connectivity status and restart failed requests
if users go from a disconnected to a connected network state.
-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
3、加載圖片
一般使用只加載圖片
Glide.with(fragment)
.load(url)
.into(imageView);
加載圓形圖片
// .transform(new RoundedCorners(24))直接也可以
RequestOptions mRequestOptions = RequestOptions.circleCropTransform()//圓形方法
.skipMemoryCache(true);//不做內(nèi)存緩存
GlideApp.with(this)
.load("https://ws1.sinaimg.cn/large/0065oQSqgy1fze94uew3jj30qo10cdka.jpg")
.centerCrop()
.apply(mRequestOptions)
.placeholder(R.drawable.ic_launcher_background)//加載中顯示的圖片
.error(R.drawable.ic_launcher_foreground)// 錯(cuò)誤后顯示的圖片
.into(mImg);
加載圓角
//設(shè)置圖片圓角角度
RoundedCorners roundedCorners= new RoundedCorners(6);
//通過(guò)RequestOptions擴(kuò)展功能,override:采樣率,因?yàn)镮mageView就這么大,可以壓縮圖片,降低內(nèi)存消耗
RequestOptions options=RequestOptions.bitmapTransform(roundedCorners).override(300, 300);
GlideApp.with(this)
.load("https://ws1.sinaimg.cn/large/0065oQSqgy1fze94uew3jj30qo10cdka.jpg")
.apply(options)
.into(img);
3、Glide圖片緩存
磁盤緩存策略(Disk Cache Strategy)
Glide.with(fragment)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(imageView);
僅從緩存加載圖片
Glide.with(fragment)
.load(url)
.onlyRetrieveFromCache(true)
.into(imageView);
跳過(guò)緩存
Glide.with(fragment)
.load(url)
.skipMemoryCache(true)
.into(view);
清除緩存
// This method must be called on the main thread.
Glide.get(context).clearMemory();
new AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
// This method must be called on a background thread.
Glide.get(applicationContext).clearDiskCache();
return null;
}
}
Fresco簡(jiǎn)介
依賴方面,Picasso是獨(dú)立依賴,配置的時(shí)候直接在gradle腳本中添加compile 'com.squareup.picasso:picasso:x.x.x'
1、添加依賴
implementation 'com.facebook.fresco:fresco:1.13.0'
2、添加權(quán)限
<uses-permission android:name="android.permission.INTERNET" />
3、基本用法
// 布局文件
<com.facebook.drawee.view.SimpleDraweeView
app:placeholderImage="@drawable/image_reading_girl"
android:id="@+id/draweeView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true" />
// 初始化
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Fresco.initialize(this);
}
}
// 加載圖片
SimpleDraweeView draweeView = this.findViewById(R.id.draweeView);
Uri uri = Uri.parse("https://www.baidu.com/img/bd_logo1.png");
draweeView.setImageURI(uri);
總結(jié)一下
Fresco加載圖片過(guò)多會(huì)導(dǎo)致圖片無(wú)法顯示,
Glide兩個(gè)控件同時(shí)請(qǐng)求同一個(gè)URL,網(wǎng)絡(luò)請(qǐng)求是兩次,
Imageloader一次加載圖片也會(huì)請(qǐng)求兩次URL,不知道是不是設(shè)置的問(wèn)題,
Picasso完美的解決了以上所有問(wèn)題。雖然這個(gè)框架逐漸被Fresco和Glide代替了
緩存機(jī)制
內(nèi)存緩存,讀取速度最快。
硬盤緩存(文件緩存),讀取速度比內(nèi)存緩存稍慢。
網(wǎng)絡(luò)緩存,讀取速度最慢。
其中內(nèi)存緩存和硬盤緩存對(duì)應(yīng)的類分別是LruCache和DiskLruCache。Android在Android 3.1加入了LruCache緩存類,其中維護(hù)著一個(gè)LinkedHashMap。當(dāng)我們的APP中想要加載某張圖片時(shí),先去LruCache中尋找圖片,如果LruCache中有,則直接取出來(lái)使用,如果LruCache中沒(méi)有,則去文件系統(tǒng)中尋找,如果有則取出來(lái)使用,同時(shí)將圖片添加到LruCache中,如果沒(méi)有,則連接網(wǎng)絡(luò)從網(wǎng)上下載圖片。圖片下載完成后,將圖片通過(guò)DiskLruCache緩存到本地,然后放到LruCache中。
Glide緩存
Glide雖然只有內(nèi)存和磁盤緩存,在性能上比不上Fresco;但他也有另外的優(yōu)點(diǎn), Fresco緩存的時(shí)候,只會(huì)緩存原始圖像,而Glide則會(huì)根據(jù)ImageView控件尺寸獲得對(duì)應(yīng)的大小的bitmap來(lái)展示,從而緩存也可以針對(duì)不同的對(duì)象:原始圖像(source),結(jié)果圖像(result); 可以通過(guò).diskCacheStrategy()方法設(shè)置:
public enum DiskCacheStrategy {
/** Caches with both {@link #SOURCE} and {@link #RESULT}. */
ALL(true, true),
/** Saves no data to cache. */
NONE(false, false),
/** Saves just the original data to cache. */
SOURCE(true, false),
/** Saves the media item after all transformations to cache. */
RESULT(false, true);
}
Fresco緩存
Fresco緩存也是一大亮點(diǎn), 三級(jí)緩存,分別是 Bitmap緩存,未解碼圖片緩存, 文件緩存。
這里提一點(diǎn)Bitmap緩存:在5.0以下系統(tǒng),Bitmap緩存位于ashmem,這樣Bitmap對(duì)象的創(chuàng)建和釋放將不會(huì)引發(fā)GC,更少的GC會(huì)使你的APP運(yùn)行得更加流暢。5.0及其以上系統(tǒng),相比之下,內(nèi)存管理有了很大改進(jìn),所以Bitmap緩存直接位于Java的heap上。
另外,磁盤緩存還可以通過(guò)代碼來(lái)設(shè)置不同手機(jī)的緩存容量:
String diskCacheUniqueName){
DiskCacheConfig diskCacheConfig = DiskCacheConfig.newBuilder(context)
.setMaxCacheSize(DISK_CACHE_SIZE_HIGH)
.setMaxCacheSizeOnLowDiskSpace(DISK_CACHE_SIZE_LOW)
.setMaxCacheSizeOnVeryLowDiskSpace(DISK_CACHE_SIZE_VERY_LOW)
.build();
ImagePipelineConfig config = ImagePipelineConfig.newBuilder(context)
.setMainDiskCacheConfig(diskCacheConfig)
.build();
Fresco.initialize(context, config);
參考鏈接:
Glide簡(jiǎn)介:
項(xiàng)目地址:https://github.com/bumptech/glide
官方文檔:https://muyangmin.github.io/glide-docs-cn/
glide加載圖片:http://m.itdecent.cn/p/2edd1767d66b
Fresco簡(jiǎn)介:
項(xiàng)目地址:https://github.com/facebook/fresco
緩存:https://blog.csdn.net/csdn_aiyang/article/details/80683479