8.牛批了 Android 2022高级 资深面试题 一线大厂和二线大厂面试真题精选 (腾讯 附答案)第八套 35k+
12年毕业,专科生,做安卓9年了。横扫深圳各大互联网公司,从开始的4k工资到现在的4万。我经历了什么?
UploadDbHelp.getInstance().getAllTaskSyn(new UploadDbHelp.DbCallback<UploadInfo>() { @Override public void getResult(List<? extends UploadInfo> list) { if (list != null && !list.isEmpty()) { addTaskList((List<UploadInfo>) list, false); } } });
fun getAllTaskSyn(dbCallback: DbCallback<UploadInfo>): List<UploadInfo>? {var list: List<UploadInfo>? = null GlobalScope.launch {withContext(Dispatchers.IO) {BNLog.d(TAG, "getAllTaskSyn before")list = getAllTask()BNLog.d(TAG, "getAllTaskSyn after get 线程 ing :" + Thread.currentThread().name + "大小:" + list?.size)}withContext(Dispatchers.Main) {BNLog.d(TAG, "getAllTaskSyn main " + Thread.currentThread().name)dbCallback.getResult(list)}}BNLog.d(TAG, "getAllTaskSyn return")return list }
lazy:委托函数
lazy使用:lateinit 只用于变量 var,而 lazy 只用于常量 val
lazy 应用于单例模式(if-null-then-init-else-return),而且当且仅当变量被第一次调用的时候,委托方法才会执行。
val transferDB by lazy { Room.databaseBuilder( CloudServiceApp.getInstance(), TransferDatabase::class.java, "transfer.db" ) .fallbackToDestructiveMigration() .allowMainThreadQueries().build() }
object UserInfoLiveData {val loginEntity: MutableLiveData<UserInfoEntity> by lazy {MutableLiveData<UserInfoEntity>()} }
1)首先说下RecycleView的缓存结构:
Recycleview有四级缓存,分别是mAttachedScrap(屏幕内),mCacheViews(屏幕外),mViewCacheExtension(自定义缓存),mRecyclerPool(缓存池)
mAttachedScrap(屏幕内)
,用于屏幕内itemview快速重用,不需要重新createView和bindViewmCacheViews(屏幕外)
,保存最近移出屏幕的ViewHolder,包含数据和position信息,复用时必须是相同位置的ViewHolder才能复用,应用场景在那些需要来回滑动的列表中,当往回滑动时,能直接复用ViewHolder数据,不需要重新bindView。mViewCacheExtension(自定义缓存)
,不直接使用,需要用户自定义实现,默认不实现。mRecyclerPool(缓存池)
,当cacheView满了后或者adapter被更换,将cacheView中移出的ViewHolder放到Pool中,放之前会把ViewHolder数据清除掉,所以复用时需要重新bindView。
2)四级缓存按照顺序需要依次读取。所以完整缓存流程是:
- 保存缓存流程:
- 插入或是删除
itemView
时,先把屏幕内的ViewHolder保存至AttachedScrap
中 - 滑动屏幕的时候,先消失的itemview会保存到
CacheView
,CacheView大小默认是2,超过数量的话按照先入先出原则,移出头部的itemview保存到RecyclerPool缓存池
(如果有自定义缓存就会保存到自定义缓存里),RecyclerPool缓存池会按照itemview的itemtype
进行保存,每个itemType缓存个数为5个,超过就会被回收。
- 获取缓存流程:
- AttachedScrap中获取,通过pos匹配holder——>获取失败,从
CacheView
中获取,也是通过pos获取holder缓存
——>获取失败,从自定义缓存
中获取缓存——>获取失败,从mRecyclerPool
中获取
——>获取失败,重新创建viewholder
——createViewHolder并bindview。
3)了解了缓存结构和缓存流程,我们再来看看具体的问题
滑动10个,再滑回去,会有几个执行onBindView?
- 由之前的缓存结构可知,需要重新执行
onBindView
的只有一种缓存区,就是缓存池mRecyclerPool
。
所以我们假设从加载RecyclView
开始盘的话(页面假设可以容纳7条数据):
- 首先,7条数据会依次调用
onCreateViewHolder
和onBindViewHolder
。 - 往下滑一条(position=7),那么会把position=0的数据放到
mCacheViews
中。此时mCacheViews
缓存区数量为1,mRecyclerPool
数量为0。然后新出现的position=7的数据通过postion在mCacheViews
中找不到对应的ViewHolder
,通过itemtype
也在mRecyclerPool
中找不到对应的数据,所以会调用onCreateViewHolder
和onBindViewHolder
方法。 - 再往下滑一条数据(position=8),如上。
- 再往下滑一条数据(position=9),position=2的数据会放到
mCacheViews
中,但是由于mCacheViews
缓存区默认容量为2,所以position=0的数据会被清空数据然后放到mRecyclerPool
缓存池中。而新出现的position=9数据由于在mRecyclerPool
中还是找不到相应type的ViewHolder,所以还是会走onCreateViewHolder
和onBindViewHolder
方法。所以此时mCacheViews
缓存区数量为2,mRecyclerPool
数量为1。 - 再往下滑一条数据(position=10),这时候由于可以在
mRecyclerPool
中找到相同viewtype的ViewHolder了。所以就直接复用了,并调用onBindViewHolder
方法绑定数据。 - 后面依次类推,刚消失的两条数据会被放到
mCacheViews
中,再出现的时候是不会调用onBindViewHolder方法,而复用的第三条数据是从mRecyclerPool
中取得,就会调用onBindViewHolder
方法了。
4)所以这个问题就得出结论了(假设mCacheViews
容量为默认值2):
- 如果一开始滑动的是新数据,那么滑动10个,就会走10个
bindview
方法。然后滑回去,会走10-2个bindview
方法。一共18次调用。 - 如果一开始滑动的是老数据,那么滑动10-2个,就会走8个
bindview
方法。然后滑回去,会走10-2个bindview
方法。一共16次调用。
但是但是,实际情况又有点不一样。因为Recycleview
在v25版本引入了一个新的机制,预取机制
。
预取机制
,就是在滑动过程中,会把将要展示的一个元素提前缓存到mCachedViews
中,所以滑动10个元素的时候,第11个元素也会被创建,也就多走了一次bindview
方法。但是滑回去的时候不影响,因为就算提前取了一个缓存数据,只是把bindview
方法提前了,并不影响总的绑定item数量。
所以滑动的是新数据的情况下就会多一次调用bindview
方法。
5)总结,问题怎么答呢?
- 四级缓存和流程说一下。
- 滑动10个,再滑回去,
bindview
可以是19次调用,可以是16次调用。 - 缓存的其实就是缓存item的view,在Recycleview中就是
viewholder
。 cachedView
就是mCacheViews
缓存区中的view,是不需要重新绑定数据的。
IdleHandler 是 MessageQueue 的静态内部接口。
IdleHandler,这是一种在只有当消息队列没有消息时或者是队列中的消息还没有到执行时间时才会执行的 IdleHandler,它存放在mPendingIdleHandlers队列中。
平时是如何使用的:
Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler() {
@Override
public boolean queueIdle(){
//空闲时处理逻辑
return false;
}
});
从之前的类定义可以看出,返回 false 表示执行后就将该回调移除掉,返回 true 表示该 IdleHandler 一直处于活跃状态,只要空闲就会被回调。
8.牛批了 Android 2022高级 资深面试题 一线大厂和二线大厂面试真题精选 (腾讯 附答案)第八套 35k+相关推荐
- 9.牛批了 Android 2022高级 资深面试题 一线大厂和二线大厂面试真题精选 (字节跳动 附答案)第九套 38k+
笔者是面霸,面试500+场 当过考官:面过别人500+场 去过500强,也呆过初创公司. 斩获腾讯.华为.字节跳动,蚂蚁金服,OPPO,美团,安卓岗offer!我有一套速通大厂技巧 ...
- 10.牛批了 Android 2022高级 资深面试题 一线大厂和二线大厂面试真题精选 (蚂蚁金服 附答案)第十套 40k+
笔者是面霸,面试500+场 当过考官:面过别人500+场 去过500强,也呆过初创公司. 斩获腾讯.华为.字节跳动,蚂蚁金服,OPPO,美团,安卓岗offer!我有一套速通大厂技巧 ...
- 7.牛批了 Android 2022高级资深面试题 一线大厂和二线大厂面试真题精选 (大疆 附答案)第七套 30k+
笔者是面霸,面试500+场 当过考官:面过别人500+场 去过500强,也呆过初创公司. 斩获腾讯.华为.字节跳动,蚂蚁金服,OPPO,美团,安卓岗offer!我有一套速通大厂技巧 ...
- 2.牛批了 Android 2021中高级面试题 一线大厂和二线大厂面试真题精选 (京东 附答案)第二套 22k+
笔者是面霸,面试500+场 当过考官:面过别人500+场 去过500强,也呆过初创公司. 斩获腾讯.美团,字节跳动,蚂蚁金服,华为.OPPO,offer!我有一套速通大厂技巧分享给 ...
- 6.牛批了 Android 2021中高级面试题 一线大厂和二线大厂面试真题精选 (小米 附答案)第三套 28k+
笔者是面霸,面试500+场 当过考官:面过别人500+场 去过500强,也呆过初创公司. 斩获腾讯.华为.字节跳动,蚂蚁金服,OPPO,美团,安卓岗offer!我有一套速通大厂技巧 ...
- 2021年最新腾讯、B站等一线互联网Android面试真题合集(附答案),让你面试轻松无压力
背景 2021年7月,我从工作两年的腾讯离职了.离职前同事帮我弄到了B站的内推,经过3面后,9月4号我拿着26K的offer顺利的进入B站. 作为一名资深技术宅,国漫和日番一直让我爱不释手.平时有了时 ...
- Android面试专题 | 大厂安卓开发高频面试真题174问(附详细答案)
每年求职季就是修罗场,无数人削尖了脑袋想进大厂,我身边当然不乏和我一样心怀大厂梦的人,但大家也都清楚进入大厂的难度有多高. 在入职谷歌之前我也曾经历无数坎坷,陷入过技术瓶颈和人生低谷,面试前艰苦的复习 ...
- 秋招如何抱佛脚?2022最新大厂Java面试真题合集(附权威答案)
2022秋招眼看着就要来了,但是离谱的是,很多同学最近才想起来还有秋招这回事,所以纷纷临时抱佛脚,问我有没有什么快速磨枪的方法, 我的回答是:有! 说起来,临阵磨枪没有比背八股文更靠谱的了,很多人对这 ...
- 金三银四如何抱佛脚?2022 最新大厂 Java 面试真题合集(附权威答案)
这些面试资料都是我通过各种渠道收集到的大厂面试真题,并附有最新的权威答案,绝不是网络上那些已经是几年前甚至十几年前的面试题所能媲美的,除面试题外还有我整理的一些经典 Java 学习电子书也都可以无偿分 ...
最新文章
- pandas使用pd.MultiIndex.from_product函数和pd.MultiIndex.from_tuples函数创建复合索引dataframe数据实战
- Solarium简易使用
- 拆解声网Q4财报:除了“元宇宙”,我们还应该关注什么?
- 图像特征提取与描述_角点特征02:SIFT算法+SURF算法
- 关于硬盘运行在不同模式下的疑难解答
- 菜鸟教程php上传图片,PHP 文件上传
- 【转】Java垃圾收集器
- 借助Docker,在win10下编码,一键在Linux下测试
- windows蜜汁调音
- atitit opencv apiattilax总结 约500个函数 .xlsx
- matlab与焓湿图,excel与焓湿图的完美结合
- awr报告 解读_Oracle Awr报告_awr报告解读_基础简要信息
- 试验设计——正交试验设计
- Java获取字符串长度(length())
- en结尾的单词_en后缀形容词——动词
- java读取qq邮箱邮件
- 北京8成楼盘降价促销 房价已下跌10%-15%
- specified sample format s16 is invalid or not supported(linux)
- 世界工厂不好当了 东莞面临新一轮企业倒闭潮
- 18_NumPy数组ndarray中提取,删除满足条件的元素,行和列
热门文章
- 【Houdini】新发现的整理节点排版快捷键
- linux文件做软连接,Linux建立软连接和硬链接
- ASP.NET CodeFile VS CodeBehind
- weblogic.xml 中 filter-dispatched-requests-enabled 的作用
- 易语言创建线程挂起线程恢复线程销毁线程
- cocos creator prefab中的label设置容无效的问题
- c语言万年历查询程序代码,C语言小程序实现万年历
- 一级计算机ie浏览器使用操作,2012计算机等级考试一级高分考点:IE操作
- eclipse for windows8 下载与安装
- 蓝牙耳机打电话流程hci.log解析