【Android】Android UI 绘制相关面试题(三)

1、请谈谈View.inflate和LayoutInflater.inflate的区别?

实际上没有区别

  • View.inflate实际上是对LayoutInflater.inflate做了一层包装,在功能上,LayoutInflate功能更加强大。
  • View.inflate实际上最终调用的还是LayoutInflater.inflate(@LayoutRes int resource,@nullable ViewGroup root)三个参数的方法,这里如果传入的root如果不为空,那么解析出来的View会被添加到这个ViewGroup当中去。
  • 而LayoutInflater.inflate方法则可以指定当前View是否需要添加到ViewGroup中去

2、请谈谈invalidate()和postInvalidate() 方法的区别和应用场景?

  • invalidate()用来重绘UI,需要在UI线程调用。
  • postInvalidate()也是用来重新绘制UI,它可以在UI线程调 用,也可以在子线程中调用,postInvalidate()方法内部通过Handler发送了一个消息将线程切回到UI线程通知重新绘制,并不是说postInvalidate()可以在子线程更新UI,本质上还是在UI线程发生重绘,只不过我们使用postInvalidate()它内部会帮我们切换线程

3、谈一谈SurfaceView与TextureView的使用场景和用法?

  • 频繁绘制和对帧率要求比较高的需求,比如拍照、视频和游戏等
  • SurfaceView有独立的绘图表面,可以在子线程中进行绘制, 缺点是不能够执行平移、缩放、旋转、透明渐变操作,TextureView的出现就是为了解决这些问题
  • SurfaceView的使用方法,大概是获取SurfaceHolder 对象,监听surface创建,更新,销毁,创新一个新的线程,并在其中绘制并提交
  • TextureView并没有独立的绘图表面,在使用过程中, 需要添加监听surfaceTexture是否可用,再做相应的处理

4、谈一谈RecyclerView.Adapter的几种刷新方式有何不同?

刷新全部可见的item,notifyDataSetChanged() 刷新指定item,notifyItemChanged(int) 从指定位置开始刷新指定个item,notifyItemRangeChanged(int,int)插入、移动一个并自动刷新,notifyItemInserted(int)、notifyItemMoved(int)、notifyItemRemoved(int) 局部刷新,notifyItemChanged(int, Object)

5、有了解过WindowInsets吗?它有哪些应用?

ViewRootImpl在performTraversals时会调dispatchApplyInsets,内调DecorViewdispatchApplyWindowInsets,进行WindowInsets的分发。

6、请谈谈什么是同步屏障?

handler.getLooper().getQueue().postSyncBarrier()加入同步屏障后,Message.obtain()获取一个target为null的msg,并根据当前时间将该msg插入到链表中。在Looper.loop()循环取消息中 Message msg = queue.next(); target为空时,取链表中的异步消息。通过setAsynchronous(true)来指定为异步消息应用场景:ViewRootImpl scheduleTraversals中加入同步屏障并在view的绘制流程中post异步消息,保证view的绘制消息优 先执行

7、谈一谈屏幕刷新机制?

屏幕刷新频率和绘制频率cpu负责 measurelayoutdraw =>displayListgpu 负责 display => 位图每个16ms会发送一次垂直同步信号, vsync每次信号发送的时候都会从gpu的buffer中取出渲染好的位图显示在屏幕上,同时如果有需要 还会进行下一次的 cpu计算,计算好后放入buffer中,如果计算时间超过了两次vsync之间的时间 ,即16ms ,则vsync信号会把 上一次gpu buffer中的信息展示出来,这时候就是卡顿,另外如果页面没有变化 屏幕还是一样会去buffer中取出上一次的刷新,只不过cpu不再去计算而已

#android面试#
全部评论

相关推荐

看到这个话题呢我觉得我是有点经验要分享的。先说一下我的实习经历,我是六月进入一家上市公司做的嵌入式软,一直实习到10月底离职。最终结果是没有转正成功,但还好抓住了秋招在11月初拿到offer。个人建议是能实习一定要实习,尤其是双飞,大佬可以不考虑但有总比没有强,多一份竞争力。先说一些我的观点:实习干的业务一定要与你未来投递和就业岗位相关。(比如你去一家公司实习职位是硬件,然后未来就业投递的是软件,你的简历上有这有段实习经历用途也不大。)实习时间一定要大于三个月小于六个月,时间太短小于三个月,可信度低,其次你在公司做的事情也会比较少,没有什么可以写在简历。大于六个月的话除非你时间充足,且保证转正,否则可能错过秋招或者春招,甚至HR可能会问到为什么实习那么久没有留下来。实习转正概率一般比外面进去概率大,一般都有50%以上的概率(不是所有),而且内部进去可以少测评和笔试,甚至面试都可能省去,只要你平常表现的好。(我的那家实习公司我们同期五个人最终进去三个且没有笔试和面试。直接通知的结果签的三方。)所以个人建议是实习和秋招同时进行,但是如果学校和个人实力够好,也可以不实习。注意:如果去的公司分配给你的都是杂活,学不到东西,那早日run。我个人实习经历:六月才去,给我分配了一个mentor,mentor是项目负责人,然后就把我也加入了项目中,让我先看手册了解硬件外设,写框架说明书之类,比较简单。除此之外然后我还会被别的项目中的人叫去做一些板子焊接和简单板子测试。总的来说一天比较忙碌和充实。一直到九月初,一边抓公司的事情,下班后回去复习面试资料(面试资料我放到最地底下的链接里)。一天就是工作,学习,投简历,做北森行测测评,偶尔有个笔试再抽时间做笔试。说实话真的很累。比一天都在图书馆学习还累。但是还是要坚持,因为对于我一个双飞本(普通的)我实习公司校招招的都是211本也有研究生叭,实习能进去那是最好的。外面走校招可能简历都pass。我们同期5个都是双飞本。除此之外我mentor对我还是比较好的,任务上没有太多,没那么大压力,也请教他很多问题,最后离职走的那一天还请我吃了一顿饭。最后我想说一下我对秋招看法:秋招仿佛我们身处一片汪洋,周围被大雾弥漫,我们周围有很多大大小小岛屿(公司),我们也知道要投递哪个岗位,但是我们无法感知距离是多少,我们可能投了上百家公司,但是没有回应或者卡在一面二面等等情况。会迷茫会停止。但是我想说的是找工作也是一种运气,不要自我怀疑,努力提升自我核心竞争力,相信总一天上岸的那个人就是自己。这里借用书籍《飘》的一句话“不管怎样,明天又是新的一天。”最后也祝大家早日上岸拿到心仪的offer。后期我也会更一些实习中需要注意的坑,毕竟也是职场。面试复习资料链接:(还在持续更新中)https://www.nowcoder.com/creation/manager/columnDetail/mGYoDz#想实习转正,又想准备秋招,我该怎么办##秋招##实习##春招##牛客激励计划#
点赞 评论 收藏
分享
评论
13
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务