安卓面试必问,我懵了,学生会面试题选择题

  • Recycleview去掉了设置头部底部item的功能,专向通过viewholder的不同type实现

  • Recycleview实现了一些局部刷新,比如notifyitemchanged

  • Recycleview自带了一些布局变化的动画效果,也可以通过自定义ItemAnimator类实现自定义动画效果

  • Recycleview缓存机制更全面,增加两级缓存,还支持自定义缓存逻辑

Recycleview有几级缓存,缓存过程?

Recycleview有四级缓存,分别是mAttachedScrap(屏幕内),mCacheViews(屏幕外),mViewCacheExtension(自定义缓存),mRecyclerPool(缓存池)

  • mAttachedScrap(屏幕内),用于屏幕内itemview快速重用,不需要重新createView和bindView

  • mCacheViews(屏幕外),保存最近移出屏幕的ViewHolder,包含数据和position信息,复用时必须是相同位置的ViewHolder才能复用,应用场景在那些需要来回滑动的列表中,当往回滑动时,能直接复用ViewHolder数据,不需要重新bindView。

  • mViewCacheExtension(自定义缓存),不直接使用,需要用户自定义实现,默认不实现。

  • mRecyclerPool(缓存池),当cacheView满了后或者adapter被更换,将cacheView中移出的ViewHolder放到Pool中,放之前会把ViewHolder数据清除掉,所以复用时需要重新bindView。

四级缓存按照顺序需要依次读取。所以完整缓存流程是:

  1. 保存缓存流程:
  • 插入或是删除itemView时,先把屏幕内的ViewHolder保存至AttachedScrap

  • 滑动屏幕的时候,先消失的itemview会保存到CacheView,CacheView大小默认是2,超过数量的话按照先入先出原则,移出头部的itemview保存到RecyclerPool缓存池(如果有自定义缓存就会保存到自定义缓存里),RecyclerPool缓存池会按照itemview的itemtype进行保存,每个itemTyep缓存个数为5个,超过就会被回收。

  1. 获取缓存流程:
  • AttachedScrap中获取,通过pos匹配holder——>获取失败,从CacheView中获取,也是通过pos获取holder缓存 ——>获取失败,从自定义缓存中获取缓存——>获取失败,从mRecyclerPool中获取 ——>获取失败,重新创建viewholder——createViewHolder并bindview。

需要注意的是,如果从缓存池找到缓存,还需要重新bindview。

说说RecyclerView性能优化。

  • bindViewHolder方法是在UI线程进行的,此方法不能耗时操作,不然将会影响滑动流畅性。比如进行日期的格式化。

  • 对于新增或删除的时候,可以使用diffutil进行局部刷新,少用全局刷新

  • 对于itemVIew进行布局优化,比如少嵌套等。

  • 25.1.0 (>=21)及以上使用Prefetch 功能,也就是预取功能,嵌套时且使用的是LinearLayoutManager,子RecyclerView可通过setInitialPrefatchItemCount设置预取个数

  • 加大RecyclerView缓存,比如cacheview大小默认为2,可以设置大点,用空间来换取时间,提高流畅度

  • 如果高度固定,可以设置setHasFixedSize(true)来避免requestLayout浪费资源,否则每次更新数据都会重新测量高度。

void onItemsInsertedOrRemoved() {

if (hasFixedSize) layoutChildren();

else requestLayout();

}

  • 如果多个RecycledView 的 Adapter 是一样的,比如嵌套的 RecyclerView 中存在一样的 Adapter,可以通过设置 RecyclerView.setRecycledViewPool(pool);来共用一个 RecycledViewPool。这样就减少了创建VIewholder的开销。

  • 在RecyclerView的元素比较高,一屏只能显示一个元素的时候,第一次滑动到第二个元素会卡顿。这种情况就可以通过设置额外的缓存空间,重写getExtraLayoutSpace方法即可。

new LinearLayoutManager(this) {

@Override

protected int getExtraLayoutSpace(RecyclerView.State state) {

return size;

}

};

  • 设置RecyclerView.addOnScrollListener();来在滑动过程中停止加载的操作。

  • 减少对象的创建,比如设置监听事件,可以全局创建一个,所有view公用一个listener,并且放到CreateView里面去创建监听,因为CreateView调用要少于bindview。这样就减少了对象创建所造成的消耗

  • notifyDataSetChange时,适配器不知道整个数据集中的那些内容以及存在,再重新匹配ViewHolder时会花生闪烁。设置adapter.setHasStableIds(true),并重写getItemId()来给每个Item一个唯一的ID,也就是唯一标识,就使itemview的焦点固定,解决了闪烁问题。

面试前做好准备战!

接下来将分享面试的一个复习路线,如果你也在准备面试但是不知道怎么高效复习,可以参考一下我的复习路线,有任何问题也欢迎一起互相交流,加油吧!

这里给大家提供一个方向,进行体系化的学习:

1、看视频进行系统学习

前几年的Crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。

另外,我自己也珍藏了好几套视频,有需要的我也可以分享给你。

2、进行系统梳理知识,提升储备

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

尾声

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

最后想要拿高薪实现技术提升薪水得到质的飞跃。最快捷的方式,就是有人可以带着你一起分析,这样学习起来最为高效,所以为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。

  • 思维脑图
  • 性能优化学习笔记


  • 性能优化视频

    当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的。

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

)

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一些常见的项目经理面试问题和答案: 1. 你如何管理项目进度和时间表? 答案:我会使用项目管理工具,如Gantt图或甘特图,来跟踪项目进度和时间表。我会在项目开始时制定一个详细的计划,以确保每个任务都有一个明确的截止日期,并且所有相关方都知道他们需要完成的任务。我会定期检查进度,并在必要时对时间表进行调整。 2. 您如何处理项目中的冲突? 答案:我会首先尝试通过沟通来解决冲突。我会与项目团队成员和利益相关方进行谈话,以了解他们的观点和担忧,并尝试找到一个共同的解决方案。如果这种方法不起作用,我会考虑引入一个中立的第三方来帮助解决冲突。 3. 您如何处理项目中的变更请求? 答案:我会评估变更请求对项目的影响,并尽快向利益相关方提供反馈。如果变更请求对项目有重大影响,我会重新评估项目的时间表和预算,并与利益相关方协商解决方案。我会确保所有变更请求都经过适当的文档记录和审批流程。 4. 您如何与团队成员和利益相关方进行有效的沟通? 答案:我会保持开放和透明的沟通方式,尽可能频繁地与团队成员和利益相关方进行沟通。我会使用各种沟通工具,如电子邮件,电话会议和面对面会议,以确保信息传递到每个人。我会尽可能清晰和简洁地表达我的想法,并确保听取其他人的意见和反馈。 5. 您如何评估项目的成功? 答案:我会根据项目的目标和目标来评估项目的成功。我会跟踪项目的进度和成本,并与利益相关方共同制定评估标准。我会定期评估项目的进展,并确保项目团队和利益相关方都对项目的成功有一个共同的理解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值