Glide 源码分析与面试提问
问题:
1.使用的什么网络请求
使用的HttpURLConnection
com.bumptech.glide.load.model.stream.HttpGlideUrlLoader
com.bumptech.glide.load.data.HttpUrlFetcher
2.缓存
使用了内存缓存LruCache
和 DiskLruCache
DiskCache 分为两种类型一种是元数据DATA_DISK_CACHE,一种是RESOURCE_DISK_CACHE(处理过的数据)
3.内存泄漏?
4.怎么区分加载网络和assert 下面的资源?
5.架构上面有什么值得学习的地方?
6.线程切换问题怎么处理?
解析完之后,使用handler post 一个runnable
private static final Executor MAIN_THREAD_EXECUTOR =new Executor() {private final Handler handler = new Handler(Looper.getMainLooper());@Overridepublic void execute(@NonNull Runnable command) {handler.post(command);}};
就算在子线程中,也可以使用MainLooper 构建一个handler 发送runnable.
7.怎么和声明周期绑定的?
8.多个任务怎么处理?
为什么要自己写一个ExecutorService?
9.build模式的好处是什么?
10.每个fragment 都有自己的
@NonNullpublic RequestManager get(@NonNull Fragment fragment) {Preconditions.checkNotNull(fragment.getContext(),"You cannot start a load on a fragment before it is attached or after it is destroyed");if (Util.isOnBackgroundThread()) {return get(fragment.getContext().getApplicationContext());} else {FragmentManager fm = fragment.getChildFragmentManager();return supportFragmentGet(fragment.getContext(), fm, fragment, fragment.isVisible());}}
RequestManager 吗?
对,每个都有,用于管理当前页面的所有的Request
11.各个模块都是怎么设计的,怎么粘合在一起的?
比如网络,缓存,图片解析。
12.Priority 优先级怎么实现的 ?
13.占位图,失败图,怎么设计的?
怎么设计的? 实现简单啊。很烂的代码都可以实现,但是,设计不一样。
14.请求的一个状态
请求的状态怎么管理,怎么样验证?
怎么保证多线程没有问题。
根据Map去管理所有的任务
15.request 只负责调用加载图片,然后传给target,
具体target 怎么使用图片资源,那就是target 的责任。
还有就是资源路径的管理。
具体加载由engine 加载,这样的好处是什么?
对外值开放功能,不暴露细节?
16.为什么target 要有request 的引用?
要保证当前的target 没有其他的请求。
17.引擎是个什么类,责任是啥?
18.ModelLoader 应该会有很多,比如从文件,从网络。
modelloader 负责去生成LoadData
LoadData里面包含DataFetcher
19.每个人真的分的很清楚,策略就是计算bitmap 占用大小的。虽然可以在lruCache 里面直接写。
20.engine 和 engineJob 的作用是什么?
engine:
Responsible for starting loads and managing active and cached resources.
引擎负责管理首先从缓存里面加载需要的资源,如果没有,则开启新的任务
21.预加载图片
22. 应该会有很多的request,那么glide 开了几个线程去处理呢? 很多请求用的什么队列?
23.为什么增加了
SupportRequestManagerFragment current =(SupportRequestManagerFragment) fm.findFragmentByTag(FRAGMENT_TAG);if (current == null) {current = pendingSupportRequestManagerFragments.get(fm);if (current == null) {current = new SupportRequestManagerFragment();current.setParentFragmentHint(parentHint);if (isParentVisible) {current.getGlideLifecycle().onStart();}pendingSupportRequestManagerFragments.put(fm, current);fm.beginTransaction().add(current, FRAGMENT_TAG).commitAllowingStateLoss();
fm.beginTransaction().add(current, FRAGMENT_TAG).commitAllowingStateLoss(); 原理是什么?为什么就能监听fragment 的生命周期了?
22.GlideExecutor 的作用
只是包装了一下ThreadPoolExecutor,里面的线程名名字等做了下封装。
你会发现,有很多的Wrapper,每个Wrapper 都会有自己的作用。
每一个都是viewTarget, 每一个都有一个request.
24.glide 架构清晰:
RequestManager
RequestBuilder
RequestTracker
target
request
engy
job
engyjob
怎么加载Assets文件
load(“file:///android_asset/banner7_bg.png”)
AssetUriLoader StreamAssetPathFetcher 负责
https://zhuanlan.zhihu.com/p/60425157
看了源码,你才知道,具体干活的代码可能就那一段,就像现实生活中真正干活的就那一个人,但是其他的管理者还是需要的。
Glide 源码分析与面试提问相关推荐
- Android 图片框架原理——Glide源码分析
目录 前言 一.With() 二.load() 三.into() 1. buildImageViewTarget() 2.关注1 :buildRequest 构建 3.关注2:runRequest 执 ...
- 图片加载—Glide为什么这么强?Glide源码分析(下)
写在前面 Github–Glide 镇楼 欢迎光临下篇 ~ 目录 (上) 1.代码实例 2.GlideApp 3.with 4.监听生命周期 5.load 6.into (下) 1.资源加载和缓存机制 ...
- Glide源码分析3 -- 绑定Activity生命周期
1. 概述和核心类 Glide中一个重要特性是Request可以随Activity或Fragment的onStart而resume,onStop而pause,onDestroy而clear,从而节约流 ...
- Glide源码阅读理解一小时
前言 这篇图.文.表.代码一起组成的 Glide 源码分析的文章是在上一篇文章 Android-Universal-Image-Loader源码分析 中之后的又一篇图片加载框架源码解析,它也具备了 I ...
- glide源码中包含了那种设计模式_月薪20+的程序员面试都问这些高端技术题(含答案+面试指导)...
不知道大家有没有发现,最近情况在慢慢好转,现在我们小区已经解控了,再也不要绕远路出门了,可喜可贺. 当然,我们的金三银四马上也要发挥它该有的作用了,尚未找到工作的朋友们,准备好了吗? 今天给大家带来的 ...
- 阿里面试这样问:Nacos配置中心交互模型是 push 还是 pull ?(原理+源码分析)...
本文来源:公众号「 程序员内点事」 对于Nacos大家应该都不太陌生,出身阿里名声在外,能做动态服务发现.配置管理,非常好用的一个工具.然而这样的技术用的人越多面试被问的概率也就越大,如果只停留在使用 ...
- spring源码分析第六天------spring经典面试问题
spring源码分析第六天------spring经典面试问题 1.Spring5 新特性及应用举例 2.Spring 经典的面试问题 a.什么是 Spring 框架?Spring 框架有哪些主要模块 ...
- java多线程系列:ThreadPoolExecutor源码分析,java基础面试笔试题
我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...
- 面试必会之ArrayList源码分析手写ArrayList
作者:Java知音-微笑面对生活 简介 ArrayList是我们开发中非常常用的数据存储容器之一,其底层是数组实现的,我们可以在集合中存储任意类型的数据,ArrayList是线程不安全的,非常适合用于 ...
最新文章
- ocrosoft Contest1316 - 信奥编程之路~~~~~第三关 问题 E: IQ(iq)
- Java开发工具和环境,你了解多少?(二)
- 产品经理这个角色真的泡沫越来越大吗?
- html走马观花效果,走马观花台湾行 用EF-S 10-18来记录风景
- ptmalloc,tcmalloc和jemalloc内存分配策略研究
- 16进制颜色与UIColor互转
- android字体单位sp,Android中的常用尺寸单位(dp、sp)快速入门教程
- Urlrewrite地址重写
- WordPress社交网络菜单图标更改——SVG图标
- 关于能力素质模型建模
- 测试行业4年经验,面试进了阿里,二个月后我果断选择裸辞...
- P2504 [HAOI2006]聪明的猴子-题目详解
- 操作系统MSXML组件版本过低,导致启动失败的原因
- 手机信号不好?真不是套餐原因!4招教你搞定!
- “如果没有从事研发,学习自动化的我可能在装水表”
- 隐马尔科夫模型(HMM)模型训练:Baum-Welch算法
- 【C语言】BC102 带空格直角三角形图案(DAY 9)
- 解决 输入kubectl get pods -o wide后没有显示ip
- 安静且高效一点就好3
- LeetCode T509 T16 T33 T34 T36 T41 T43 T48 T49
热门文章
- linux下 get,Unix/Linux下 getrusage 的用法
- python行为识别_牛!Python 也能实现图像姿态识别溺水行为了
- 计算机编码技术ppt,计算机编码技术.ppt
- python生成wheel包注意事项
- 893B. Beautiful Divisors#美丽的因子(打表法)
- 半导体并购停不下来 ADI拟148亿美元收购Linear
- HDFS块文件和存放目录的关系
- arm linux中添加开机启动
- 时域和频域变换之---傅里叶级数的数学推导
- 首款移动社交购物平台“商宝”上线发布