简介

Glide 是目前非常流行的图片加载第三方开源库,而且功能极其强大,内部代码复杂程度也极其大。

Glide是纯Java写的Android端开源图片加载库,能够帮助我们下载、缓存、展示多种格式图片,也包括GIF格式 。

特点:原理Glide库的资源复用:Glide库图片池:Glide加载发起流程:
  1. Glide.with(context)创建RequestManager

2.Glide.with(context).load(url)创建需要的Request

3.Glide.with(context).load(url).into(imageview)

Glide加载资源:Glide常用的加载方法1、加载图片到imageView

1. Glide.with(Context context).load(Strint url).into(ImageView imageView);

2、各种形式的图片加载到ImageView

1. // 加载本地图片 2. File file = new File(getExternalCacheDir() "/image.jpg"); 3. Glide.with(this).load(file).into(imageView); 4. // 加载应用资源 5. int resource = R.drawable.image; 6. Glide.with(this).load(resource).into(imageView); 7. // 加载二进制流 8. byte[] image = getImageBytes(); 9. Glide.with(this).load(image).into(imageView); 10. // 加载Uri对象 11. Uri imageUri = getImageUri(); 12. Glide.with(this).load(imageUri).into(imageView);

3、加载带有占位图

1. Glide.with(this).load(url).placeholder(R.drawable.loading).into(imageView);

占位图目的为在目的图片还未加载出来的时候,提前展示给用户的一张图片;

4、加载失败 放置占位符

1. Glide.with(this).load(url).placeholder(R.drawable.loading).error(R.drawable.error) 2. .diskCacheStrategy(DiskCacheStrategy.NONE)//关闭Glide的硬盘缓存机制 3. .into(imageView); 4. //DiskCacheStrategy.NONE:表示不缓存任何内容。 5. //DiskCacheStrategy.SOURCE:表示只缓存原始图片。 6. //DiskCacheStrategy.RESULT:表示只缓存转换过后的图片(默认选项)。 7. //DiskCacheStrategy.ALL :表示既缓存原始图片,也缓存转换过后的图片。

5、加载指定格式的图片--指定为静止图片

1. Glide.with(this) 2. .load(url) 3. .asBitmap()//只加载静态图片,如果是git图片则只加载第一帧。 4. .placeholder(R.drawable.loading) 5. .error(R.drawable.error) 6. .diskCacheStrategy(DiskCacheStrategy.NONE) 7. .into(imageView);

6、加载动态图片

1. Glide.with(this) 2. .load(url) 3. .asGif()//加载动态图片,若现有图片为非gif图片,则直接加载错误占位图。 4. .placeholder(R.drawable.loading) 5. .error(R.drawable.error) 6. .diskCacheStrategy(DiskCacheStrategy.NONE) 7. .into(imageView);

7、加载指定大小的图片

1. Glide.with(this) 2. .load(url) 3. .placeholder(R.drawable.loading) 4. .error(R.drawable.error) 5. .diskCacheStrategy(DiskCacheStrategy.NONE) 6. .override(100, 100)//指定图片大小 7. .into(imageView);

8、关闭框架的内存缓存机制

1. Glide.with(this) 2. .load(url) 3. .skipMemoryCache(true) //传入参数为false时,则关闭内存缓存。 4. .into(imageView);

9、关闭硬盘的缓存

1. Glide.with(this) 2. .load(url) 3. .diskCacheStrategy(DiskCacheStrategy.NONE) //关闭硬盘缓存操作 4. .into(imageView); 5. //其他参数表示: 6. //DiskCacheStrategy.NONE:表示不缓存任何内容。 7. //DiskCacheStrategy.SOURCE:表示只缓存原始图片。 8. //DiskCacheStrategy.RESULT:表示只缓存转换过后的图片(默认选项)。 9. //DiskCacheStrategy.ALL :表示既缓存原始图片,也缓存转换过后的图片。

10、当引用的 url 存在 token 时解决方法

1. public class MyGlideUrl extends GlideUrl { 2. private String mUrl; 3. public MyGlideUrl(String url) { 4. • super(url); 5. • mUrl = url; 6. } 7. @Override 8. public String getCacheKey() { 9. • return mUrl.replace(findTokenParam(), ""); 10. } 11. private String findTokenParam() { 12. • String tokenParam = ""; 13. • int tokenKeyIndex = mUrl.indexOf("?token=") >= 0 ? mUrl.indexOf("?token=") : mUrl.indexOf("&token="); 14. • if (tokenKeyIndex != -1) { 15. • int nextAndIndex = mUrl.indexOf("&", tokenKeyIndex 1); 16. • if (nextAndIndex != -1) { 17. • tokenParam = mUrl.substring(tokenKeyIndex 1, nextAndIndex 1); 18. • } else { 19. • tokenParam = mUrl.substring(tokenKeyIndex); 20. • } 21. • } 22. • return tokenParam; 23. } 24. }

然后加载图片的方式为:

1. Glide.with(this) 2. .load(new MyGlideUrl(url)) 3. .into(imageView);

11、利用Glide将图片加载到不同控件或加载成不同使用方式

(1)、拿到图片实例

1. //1、通过自己构造 target 可以获取到图片实例 2. SimpleTarget<GlideDrawable> simpleTarget = new SimpleTarget<GlideDrawable>() { 3. @Override 4. public void onResourceReady(GlideDrawable resource, GlideAnimation glideAnimation) { 5. • imageView.setImageDrawable(resource); 6. } 7. }; 8. //2、将图片实例记载到指定的imageview上,也可以做其他的事情 9. public void loadImage(View view) { 10. String url = "http://cn.bing.com/az/hprichbg/rb/TOAD_ZH-CN7336795473_1920x1080.jpg"; 11. Glide.with(this) 12. • .load(url) 13. • .into(simpleTarget); 14. }

(2)、将图片加载到任何位置

1. /* 2. *将图片加载为控件背景 3. */ 4. public class MyLayout extends LinearLayout { 5. private ViewTarget<MyLayout, GlideDrawable> viewTarget; 6. public MyLayout(Context context, AttributeSet attrs) { 7. • super(context, attrs); 8. • viewTarget = new ViewTarget<MyLayout, GlideDrawable>(this) { 9. • @Override 10. • public void onResourceReady(GlideDrawable resource, GlideAnimation glideAnimation) { 11. • MyLayout myLayout = getView(); 12. • myLayout.setImageAsBackground(resource); 13. • } 14. • }; 15. } 16. public ViewTarget<MyLayout, GlideDrawable> getTarget() { 17. • return viewTarget; 18. } 19. public void setImageAsBackground(GlideDrawable resource) { 20. • setBackground(resource); 21. } 22. } 23. //引用图片到指定控件作为背景 24. public class MainActivity extends AppCompatActivity { 25. MyLayout myLayout; 26. @Override 27. protected void onCreate(Bundle savedInstanceState) { 28. • super.onCreate(savedInstanceState); 29. • setContentView(R.layout.activity_main); 30. • myLayout = (MyLayout) findViewById(R.id.background); 31. } 32. public void loadImage(View view) { 33. • String url = "http://cn.bing.com/az/hprichbg/rb/TOAD_ZH-CN7336795473_1920x1080.jpg"; 34. • Glide.with(this) 35. • .load(url) 36. • .into(myLayout.getTarget()); 37. } 38. }

12、Glide 实现预加载

1. //a、预加载代码 2. Glide.with(this) 3. .load(url) 4. .diskCacheStrategy(DiskCacheStrategy.SOURCE) 5. .preload(); 6. //preload() 有两种重载 7. // 1、带有参数的重载,参数作用是设置预加载的图片大小; 8. //2、不带参数的表示加载的图片为原始尺寸; 9. //b、使用预加载的图片 10. Glide.with(this) 11. .load(url) 12. .diskCacheStrategy(DiskCacheStrategy.SOURCE) 13. .into(imageView);

总结流程图

androidglide加载不出(Android性能优化Glide巨图加载原理分析)(1)

Glide 是目前非常流行的图片加载第三方开源库,而且功能极其强大,内部代码复杂程度也极其大。经过一番心理斗争决定还是要好好学习Glide的部分源码设计。关于更多 Glide学习,我这里推荐网易高级攻城狮整理的《铺路架构师学习手册》,里面内容(100w字图解析 实战笔记)。加油Android人,不学永远在一个阶梯。私信:“手册”获取哦!

androidglide加载不出(Android性能优化Glide巨图加载原理分析)(2)

androidglide加载不出(Android性能优化Glide巨图加载原理分析)(3)

【私信:“手册”领取】大厂架构深度讲解手册

,