本站提倡有节制游戏,合理安排游戏时间,注意劳逸结合。

【源码扫描下载工具】【vim android源码】【手机商铺源码】glide源码分析

2024-11-20 14:39:30 来源:焦点 分类:焦点

1.Glide源码分析
2.Lifecycle
3.字节一面面试题解析:Glide内存优化!码分

glide源码分析

Glide源码分析

       深入剖析Glide源码:解析与理解其架构与机制

       1. Glide三大关键流程

       使用Glide加载时,码分主要包含三大关键流程:with、码分load、码分into。码分通过链式调用这些方法,码分源码扫描下载工具能轻松完成加载任务,码分但背后蕴含的码分原理复杂且源码规模庞大。分析源码时,码分需抓住重点。码分

       1.1 with主线

       with方法是码分Glide中的重要接口,可传入Activity或Fragment,码分与页面生命周期紧密关联。码分在分析中,码分vim android源码我们曾遇到线上事故,码分因伙伴在with方法中传入了Context而非Activity,导致页面消失后请求仍在后台运行,最终刷新页面时找不到加载的容器直接崩溃。因此,with方法与页面生命周期息息相关。

       1.1.1 Glide创建

       通过getRetriever方法最终获得RequestManagerRetriever对象。在Glide的构造方法中,通过双检锁方式创建Glide对象。之后,调用Glide的build方法创建一个Glide实例,传入缓存和Bitmap池等对象。

       1.1.2 RequestManagerRetriever

       Glide的手机商铺源码build方法直接创建RequestManagerRetriever对象,需requestManagerFactory参数,若未定义则默认为DEFAULT_FACTORY。获取此对象后,方便后续加载。

       1.1.3 生命周期管理

       在获取RequestManagerRetriever后,调用其get方法。当with方法传入Activity时,会在子线程调用另一个get方法,而主线程中通过fragmentGet方法,创建空Fragment并同步页面生命周期。

       1.1.4 总结

       with方法主要完成:创建Glide对象,绑定页面生命周期。

       1.2 load主线

       通过with方法获得RequetManager,92新闻源码调用load方法创建RequestBuilder对象,将加载类型赋值给model。剩余操作由into方法负责。

       1.3 into主线

       into方法负责Glide的创建和生命周期绑定。传入ImageView,根据其scaleType属性复制RequestOption。into方法调用buildRequest返回Request,并判断是否能执行请求。执行请求或从缓存获取后回调onResourceReady。

       1.3.1 发起请求

       创建request后,调用RequetManager的track方法,执行请求并添加到请求队列。判断isPaused状态,源码安装docker决定是否发起网络请求。成功加载或从缓存获取后回调onResourceReady。

       1.3.2 三级缓存

       通过EngineKey获取资源,从内存、活动缓存和LRUCache中查找。若未获取到,则发起网络请求。成功后加入活跃缓存并回调onResourceReady。

       1.3.3 onResourceReady

       资源加载完成或从缓存获取后,调用SingleRequest的onResourceReady方法。判断是否设置RequestListener,最终调用target的onResourceReady方法,显示。

       1.3.4 小结

       into方法主要步骤包括:创建加载请求、判断请求执行、从缓存获取资源、网络请求与资源回调。

       2. 手写简单Glide框架

       实现Glide需理解其特性,特别是生命周期绑定和三级缓存。手写时,着重实现这两点。在load方法中,支持多种资源加载,并使用RequestOption保存请求参数。在into方法中,传入ImageView控件,并在buildTargetRequest方法中判断是否发起网络请求。实现三级缓存逻辑,确保加载效率。使用协程进行线程切换,提高性能。通过简单API加载本地或网络链接,实现Glide功能。

Lifecycle

        Android知识总结

        类讲解

        在ComponentActivity 中的onCretae方法

        ReportFragment 类是一个Fragment,它负责分派生命周期的时间,injectIfNeededIn()就是在当前的Activity里添加一个ReportFragment。

        LifecycleRegister 类中的addObserver方法

        我们看 LifecycleRegistry 中的内部类 ObserverWithState 的创建

        执行 Lifecycling.lifecycleEventObserver

        创建 ReflectiveGenericLifecycleObserver 观察者

        接下来看 ClassesInfoCache 类的方法

        然后 Event 发生变化的时候会从 mCallbackMap 中拿去对应的class文件,然后通过反射执行对应生命周期方法。源码分析如下:

        你会发现都调用了dispatch()方法,而dispatch()方法则会判断Activity是否实现了LifecycleOwner接口,如果实现了该接口就调用 LifecycleRegister#handleLifecycleEvent() ,这样生命周期的状态就会借由LifecycleRegistry通知给各个 LifecycleObserver 从而调用其中对应 Lifecycle.Event 的方法。这种通过Fragment来感知Activity生命周期的方法其实在Glide的中也是有体现的。

        我们这边只看前进流程,后退流程同理

        ObserverWithState 是 LifecycleRegistry 的实现类

        根据前面添加观察者分析,我们的到会进入 ReflectiveGenericLifecycleObserver 中执行 onStateChanged

        执行 ClassesInfoCache 内部类 CallbackInfo#invokeCallbacks

        在 ClassesInfoCache 内部类 MethodReference#invokeCallback 我们可以看到通过反射执行生命周期方法

        实现 LifecycleObserver 的实现

        使用

字节一面面试题解析:Glide内存优化!

       当处理大量加载时,Glide在RecyclerView中的应用可能会引发内存溢出问题。解决这一问题的关键在于深入理解Glide的内存优化策略,尤其是TrimMemory和LowMemory机制。以下是对这些问题的详细解析:

       1.1 遇到内存溢出的常见场景

       在使用Glide加载大量至RecyclerView时,由于缓存策略,如果不进行适当的管理,可能会导致内存占用过高,引发内存溢出。为了防止这种情况,我们需要采取有效的优化措施。

       2.1 TrimMemory和LowMemory方法的作用

       TrimMemory和LowMemory是Android系统提供的两个内存管理接口,当系统内存紧张时,应用需要响应这些回调,释放一部分缓存资源。TrimMemory主要用于告知应用当前系统的内存状态,如内存不足,而LowMemory则更严重,意味着系统内存严重不足。

       2.2 TrimMemory和LowMemory源码分析

       深入源码可以发现,Glide会在接收到TrimMemory或LowMemory回调时,检查自身的内存占用情况,并根据策略调整缓存。这包括清除过期或不再需要的,以释放内存空间。

       2.3 Glide低内存优化操作

       为了应对内存低的情况,Glide提供了以下优化操作:一是配置合适的缓存策略,例如使用LRU(最近最少使用)算法来管理缓存,确保只保留最常使用的;二是监听系统内存变化,当接收到TrimMemory或LowMemory回调时,主动清理缓存;三是考虑使用Bitmap Pool,减少Bitmap的创建和销毁,从而节省内存。

相关推荐
一周热点