1 Glide简介:
Glide是一个图片加载框架,由Google员工开发的,在很多Google APP中大量采用,也是Google官方推荐的图片加载框架;
2 Glide的特点:
(1):生命周期的管理,既可以用于Activity,也可以用于Fragment。能够确保仅优先处理活跃的Fragment和Activity的请求,并有利于应用在必要时释放资源以避免在后台时被杀掉;
(2):支持gif图片的加载;
(3):三级缓存,内存缓存中还分为活动缓存和内存缓存;活动缓存指得是讲正在使用得图片用弱引用缓存,使用完成后到内存缓存;再到磁盘缓存;
(4):占用内存小;
3 Glide的使用
3.1 Glide网络图片加载举例
(1)库的依赖:
在build.gradle中,加入:
implementation 'com.github.bumptech.glide:glide:4.3.1'
annotationProcessor 'com.github.bumptech.glide:compiler:4.3.1'
(2)在Activity中的使用(java代码):
public class MainActivity extends AppCompatActivity {
private Context mContext;
private ImageView mImageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = this;
initView();
loadimage();
}
private void initView() {
mImageView = findViewById(R.id.imageview1);
}
private void loadimage() {
// String myUrl = "";
String myUrl = "https://static.variflight.com/assets/image/aircorp/y8.png";
Glide.with(mContext)
.load(myUrl)
.into(mImageView);
}
}
说明:
Glide是一个异步网络图片请求库,不需要定义handler就可以进行ImageView的设置;
Glide.into方法会将请求发送到RequestTracker 两个队列中 :requests和pendingRequests 请求过来之后,都是存入这两个队列;
(3)布局文件(xml文件):
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<ImageView
android:layout_width="160dp"
android:layout_height="200dp"
android:id="@+id/imageview1"
>
</ImageView>
</LinearLayout>
(4)不要忘记网络权限的申请:
在AndroidManifest.xml清单文件中,添加:
<uses-permission android:name="android.permission.INTERNET" />
3.2 Glide的常用方法:
(1)with 传入的可以是当前上下文的对象,即Context。
(2)load 加载图片,图片可以是本地图片,应用资源的图片也可以是一张网络图片。
(3)placeholder 占位符是在请求正在进行时,显示的图片。
(4)error 当请求永久失败时,会显示设置图片。
(5)into 传入要展示图片的控件。
(6)transform 用来完成剪裁(切圆)或对位图应用过滤器,但它也可以用于转换GIF动画,甚至自定义的资源类型。
4 Glide的缓存机制
Glide缓存分为内存缓存和磁盘缓存,其中内存缓存是由弱引用+LruCache组成。
取的顺序是:弱引用、LruCache、磁盘
存的顺序是:磁盘、弱引用、LruCache
(1)弱引用:
弱引用是由这样一个HashMap维护,key是缓存的key,这个key由图片url、width、height等10来个参数组成;value是图片资源对象的弱引用形式。
Map<Key, ResourceWeakReference> activeEngineResources = new HashMap<>();
(2)LruCache:
LruCache是由一个LinkedHashMap维护,根据Lru算法来管理图片。大致的原理是利用LinkHashMap链表的特性,把最近使用过的文件插入到列表头部,没使用的图片放在尾部;然后当图片大小到达预先设置的一个阀值的时候 ,按算法删除列表尾部的部分数据。
Map<T, Y> cache = new LinkedHashMap<>(100, 0.75f, true);
(3)磁盘缓存原理(DiskLruCache):
DiskCacheStrategy.DATA: 只缓存原始图片;
DiskCacheStrategy.RESOURCE:只缓存转换过后的图片;
DiskCacheStrategy.ALL:既缓存原始图片,也缓存转换过后的图片;对于远程图片,缓存 DATA和 RESOURCE;对于本地图片,只缓存 RESOURCE;
DiskCacheStrategy.NONE:不缓存任何内容;
DiskCacheStrategy.AUTOMATIC:默认策略,尝试对本地和远程图片使用最佳的策略。当下载网络图片时,使用DATA(原因很简单,对本地图片的处理可比网络要容易得多);对于本地图片,使用RESOURCE。