最常用的圖片加載框架是:Gilde蟆肆,F(xiàn)resco,Picasso晦款。Fresco是Facebook提供的開源圖片加載庫炎功,它能夠從網(wǎng)絡(luò),本地存儲(chǔ)和Android資源文件中加載圖片缓溅,且具有三級緩存設(shè)計(jì)(2級內(nèi)存蛇损,1級文件)。
兩者的使用很相似坛怪,但是也有很大的區(qū)別:
首先:
Glide加載的圖片沒有Picasso那么平滑
Picasso的內(nèi)存開銷遠(yuǎn)大于Glide淤齐,Picasso是加載了全尺寸的圖片到內(nèi)存,然后讓GPU來實(shí)時(shí)重繪大小袜匿。而Glide加載的大小和ImageView的大小是一致的床玻,因此更小,雖然內(nèi)存開銷差距不大沉帮,但是在這個(gè)問題上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è)尺寸的也緩存起來
Glide的這種方式優(yōu)點(diǎn)是加載顯示非撑蚋快。而Picasso的方式則因?yàn)樾枰陲@示之前重新調(diào)整大小而導(dǎo)致一些延遲缴允,即便你添加了這段代碼來讓
對我而言荚守,我更喜歡Glide,因?yàn)樗h(yuǎn)比Picasso快练般,雖然需要更大的空間來緩存
Glide 簡介
Glide是一個(gè)快速高效的Android圖片加載庫矗漾,注重于平滑的滾動(dòng)。Glide提供了易用的API薄料,高性能敞贡、可擴(kuò)展的圖片解碼管道(decode pipeline),以及自動(dòng)的資源池技術(shù)摄职。
Glide 支持拉取誊役,解碼和展示視頻快照,圖片琳钉,和GIF動(dòng)畫势木。Glide的Api是如此的靈活,開發(fā)者甚至可以插入和替換成自己喜愛的任何網(wǎng)絡(luò)請求框架歌懒。
默認(rèn)情況下啦桌,Glide使用的是一個(gè)定制化的基于 HttpUrlConnection 的棧,但同時(shí)也提供了與 Google Volley 和 Square OkHttp 快速集成的工具庫及皂。
雖然Glide 的主要目標(biāo)是讓任何形式的圖片列表的滾動(dòng)盡可能地變得更快甫男、更平滑,但實(shí)際上验烧,Glide幾乎能滿足你對遠(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);
//通過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);
跳過緩存
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簡介
依賴方面端幼,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加載圖片過多會(huì)導(dǎo)致圖片無法顯示庭呜,
Glide兩個(gè)控件同時(shí)請求同一個(gè)URL滑进,網(wǎng)絡(luò)請求是兩次犀忱,
Imageloader一次加載圖片也會(huì)請求兩次URL,不知道是不是設(shè)置的問題扶关,
Picasso完美的解決了以上所有問題阴汇。雖然這個(gè)框架逐漸被Fresco和Glide代替了
緩存機(jī)制
內(nèi)存緩存,讀取速度最快驮审。
硬盤緩存(文件緩存)鲫寄,讀取速度比內(nèi)存緩存稍慢。
網(wǎng)絡(luò)緩存疯淫,讀取速度最慢地来。
其中內(nèi)存緩存和硬盤緩存對應(yīng)的類分別是LruCache和DiskLruCache。Android在Android 3.1加入了LruCache緩存類熙掺,其中維護(hù)著一個(gè)LinkedHashMap未斑。當(dāng)我們的APP中想要加載某張圖片時(shí)躺盛,先去LruCache中尋找圖片枢析,如果LruCache中有末誓,則直接取出來使用留潦,如果LruCache中沒有,則去文件系統(tǒng)中尋找戚扳,如果有則取出來使用竿滨,同時(shí)將圖片添加到LruCache中队他,如果沒有董瞻,則連接網(wǎng)絡(luò)從網(wǎng)上下載圖片寞蚌。圖片下載完成后,將圖片通過DiskLruCache緩存到本地钠糊,然后放到LruCache中挟秤。
Glide緩存
Glide雖然只有內(nèi)存和磁盤緩存,在性能上比不上Fresco抄伍;但他也有另外的優(yōu)點(diǎn)艘刚, Fresco緩存的時(shí)候,只會(huì)緩存原始圖像截珍,而Glide則會(huì)根據(jù)ImageView控件尺寸獲得對應(yīng)的大小的bitmap來展示攀甚,從而緩存也可以針對不同的對象:原始圖像(source),結(jié)果圖像(result); 可以通過.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)岗喉, 三級緩存秋度,分別是 Bitmap緩存,未解碼圖片緩存沈堡, 文件緩存。
這里提一點(diǎn)Bitmap緩存:在5.0以下系統(tǒng)燕雁,Bitmap緩存位于ashmem诞丽,這樣Bitmap對象的創(chuàng)建和釋放將不會(huì)引發(fā)GC鲸拥,更少的GC會(huì)使你的APP運(yùn)行得更加流暢。5.0及其以上系統(tǒng)僧免,相比之下刑赶,內(nèi)存管理有了很大改進(jìn),所以Bitmap緩存直接位于Java的heap上懂衩。
另外撞叨,磁盤緩存還可以通過代碼來設(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簡介:
項(xiàng)目地址:https://github.com/bumptech/glide
官方文檔:https://muyangmin.github.io/glide-docs-cn/
glide加載圖片:http://www.reibang.com/p/2edd1767d66b
Fresco簡介:
項(xiàng)目地址:https://github.com/facebook/fresco
緩存:https://blog.csdn.net/csdn_aiyang/article/details/80683479