[Android]朝花夕拾之使用DexClassLoader动态加载广点通jar包

本文介绍了在Android项目中使用DexClassLoader动态加载广点通jar包的原因、方法和核心原理。通过分析Glide库的使用场景、缓存策略和源码机制,揭示了其图片加载的核心思想。此外,文章还探讨了Android热门三方库源码在面试中的重要性,并提供了一份涵盖热修复、插件化、组件化等热门框架的面试宝典。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

众所周知,优秀源码的阅读与理解是最能提升自身功力的途径,如果想要成为一名优秀的Android工程师,那么Android中优秀三方库源码的分析和理解则是必备技能。就拿比较热门的图片加载框架Glide来说,相信很多同学都使用过,那么,当别人问你下面这些问题时你是否能回答出来呢?(Glide五连发)

  • 1、为什么要在项目中使用这个库?
  • 2、这个库都有哪些用法?对应什么样的使用场景?
  • 3、这个库的核心实现原理是什么?如果让你实现这个库的某些核心功能,你会考虑怎么去实现?
  • 4、Glide源码机制的核心思想是什么?
  • 5、Glide中是如何计算一张图片的大小的?

相信能全部回答出来的同学并不多,下面我来解答一下上面几个问题。

1、为什么要在项目中使用这个库?

  • 1、多样化媒体加载:不仅可以进行图片缓存,还支持Gif、WebP、缩略图,甚至是Video。
  • 2、通过设置绑定生命周期:可以使加载图片的生命周期动态管理起来。
  • 3、高效的缓存策略:支持内存、Disk缓存,并且Picasso只会缓存原始尺寸的图片,而Glide缓存的是多种规格,也就是Glide会根据你ImageView的大小来缓存相应大小的图片尺寸。
  • 4、内存开销小:我们可以手动配置默认的Bitmap解码格式为 RGB_565格式,以减少图片占用的内存开销。

2、这个库都有哪些用法?对应什么样的使用场景?

  • 1、图片加载:Glide.with(this).load(imageUrl).override(800, 800).placeholder().error().animate().into()。
  • 2、多样式媒体加载:asBitamp、asGif。
  • 3、生命周期集成。
  • 4、可以配置磁盘缓存策略ALL、NONE、SOURCE、RESULT。

3、这个库的核心实现原理是什么?如果让你实现这个库的某些核心功能,你会考虑怎么去实现?

要想了解Glide的核心实现原理,就必须先从它的加载API Glide.with().into()来进行分析。

1、Glide&with:
  • 1、初始化各式各样的配置信息(包括缓存,请求线程池,大小,图片格式等等)以及glide对象。
  • 2、将glide请求和application/SupportFragment/Fragment的生命周期绑定在一块。
2、Glide&load:

设置请求url,并记录url已设置的状态。

3、Glide&into:
  • 1、首先根据转码类transcodeClass类型返回不同的ImageViewTarget:BitmapImageViewTarget、DrawableImageViewTarget。
  • 2、递归建立缩略图请求,没有缩略图请求,则直接进行正常请求。
  • 3、如果没指定宽高,会根据ImageView的宽高计算出图片宽高,最终执行到onSizeReay()方法中的engine.load()方法。
  • 4、engine是一个负责加载和管理缓存资源的类

其中Glide的三层缓存机制是值得我们去反复学习揣摩的,这里我们先了解下常规的三级缓存是怎样的。

常规三级缓存的流程:强引用->软引用->硬盘缓存

当我们的APP中想要加载某张图片时,先去LruCache中寻

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值