Android面试题小结
学习自
https://www.cnblogs.com/ldq2016/p/9035649.html
1一面
阿里的面试官都很和蔼。一面面试官听声音感觉应该是入职两三年的感觉。上来自我介绍后直接开始问android相关问题。
大概问题如下:
· android中的dp、px、dip相关概念
dp=dip
dp*density=px
density=dpi/160
dpi=斜长/屏幕尺寸
· handler机制,四个组成部分及源码解析
一句话:一个消息队列,无限循环从中取消息
1.MessageQueue
2.Looper内部维护一个消息队列,Looper.prepare创建,Looper.loop开始取。(Looper存放在ThreadLocal中,一个线程只有一份。ThreadLocal.get的时候,从全局map中以当前线程为键,获取另一个map,然后以ThreadLocal自身为键,获取值)
3.Message
4.Handler,初始化的时候,会获取当前线程的Looper,所以Looper.prepare需要在Handler的实例化之前。
· 布局相关的<merge>、<viewstub>控件作用及实现原理
merge+include用于消除一层布局,采用更外一层的布局,如果你想拆分xml,这个是一个不错的选择。原理,LayoutInflater的时候会进行判断。
ViewStub用于延迟加载,在实例化之前,不会占用任何资源。原理,调用的时候,删除自己,把子view添加到视图树上。ViewStub的LayoutParams生效,子View的根节点属性失效
· android中的布局优化
1.嵌套伤在何处:linear、relative需要measure2次,如果重绘的话,会以指数级增长测绘次数
2.所以我们最好一层,最好自定义一些控件,比如textview drawable存于一个控件中
3.过度绘制,去除无效背景;自定义View要用好clipRect
4.merge、view stub
5.复用也要注意,这不属于优化,但是可以不怕需求变动
6.工具:gpu渲染、过度绘制、H…View的用于查看层级与查看绘制时间
7.绘制动画,最好用SurfaceView
· relativelayout和LinearLayout在实现效果同等情况下选择使用哪个?为什么?
同层级,用后者,他更简单;
前者显然可以降低层级,这个时候用他;
· view的工作原理及measure、layout、draw流程,要求了解源码
1.measure主要进行父控件的MeasureSpec或者Window+自身LayoutParams到自身MeasureSpec的一个转换(注意wrap_content情况);
2.layout,layout方法递归调用onLayout;
3.draw,源码没有了解太多,只知道他是一步步绘制什么部分的(注意setWillNotDraw或者dispatchDraw)
· 怎样自定义一个弹幕控件?
主要实现思路可以确认为位移动画(修改参数也可)。
我们在使用的时候可以设置N行,每行并行K个。
这样问题就转化成了设计一行了。(我们另外N-1行如法炮制就可以了。)
首先有一个发射时间差,还有一个位移速度,这是每个TextView的元数据。所以我们创建一个ViewHolder进行包裹TextView。(仿RecyclerView的非侵入式设计)还给每个ViewHolder定义一系列的状态,这样可以实现对TextView的复用。(所以我们这里也不局限于TextView了,可定制化的程度其实还是挺高的,像RecyclerView一样交给我们自己去实现,当然为了方便纯文本形式的弹幕,我们还需要再封装一次)。所以我们这里需要一个Adapter。如果有处于可用状态的ViewHolder就复用他,如果没有就创建。这一层就算封装好了。
然后再封装一层,只需要给我文本数据,我就可以去做,帮你省去了View的绑定文本的操作。
搞定!一天之内肯定能写出来。
· 如果控件内部卡顿你如何去解决并优化?
首先,检测到这个问题。用GPU Rendering。Systrace检测高耗时帧,看耗时方法
(我遇到过的)问题:绘制流程中存在耗时操作或创建对象。
解决:移除或者用对象池来cache
问题:A、B、C3块面积,C的path计算太复杂,在面积增大的时候,会爆掉(display list生成太慢)
解决:干脆直接绘制整个背景为C的颜色,然后C不绘制了,只绘制A、B。这样显然是过度重绘了,但是却很好地解决了我们的问题。(其实cache住path,也是可以的。)
· listview的缓存机制
用的不多。但是知道他可以判断convertView==null来决定是复用还是创建;也可以创建ViewHolder来优化fvb
· Invalidate、postInvalidate、requestLayout应用场景
invalidate draw这一族的需要重绘的并集区域。
postInvalidate
requestLayout会给当前View的parent打标记,这是递归的。最后对于被打标记的View,绘制流程要重新走一遍。
· 多线程,5个线程内部打印hello和world,hello在前,要求提供一种方法使得5个线程先全部打印出hello后再打印5个world。
单个线程的代码大概如下
System.out.print(“hello”);
System.out.print(“world”);
用while轮询效率肯定不高。
所以我们采用wait/notify+AtomicInteger
因为要群体唤醒,所以用wait/notify
因为要在子线程自增一个数,所以用AtomicInteger
private static AtomicInteger atomicInteger = new AtomicInteger(0);
static class MyThread extends Thread {
private final Object object;
MyThread(Object object){
super();
this.object = object;
}
@Override
public void run() {
Log.i(TAG, "hello");
int currentValue = atomicInteger.incrementAndGet();
synchronized (object) {
Android面试题小结相关推荐
- Android 面试题笔记(一)
每日更新每日学习面试笔记,来自https://github.com/Moosphan/Android-Daily-Interview/ 1.自定义 Handler 时如何有效地避免内存泄漏问题? 问题 ...
- linux c语言常见面试题及答案,Linux下C语言的几道经典面试题小结(分享)
Linux下C语言的几道经典面试题小结(分享) 本篇文章整理了几道Linux下C语言的经典面试题,相信对大家更好的理解Linux下的C语言会有很大的帮助,欢迎大家探讨指正. 1.如果在Linux下使用 ...
- Android 基本面试题
Android 基本面试题 一.java 核心思想 1.八种基本数据类型和封装类 基本类型 大小(字节) byte 1 short 2 int 4 long 8 float 4 double 8 bo ...
- 【Android面试】Android面试题集锦 (陆续更新)(最新2012-6-18)
1.android开发新浪面试题[开发者必看哦] 下载地址 http://www.eoeandroid.com/thread-177885-1-1.html 2.华为关于android笔试题案例解析 ...
- android面试题总结加强
在加强版的基础上又再加强的android应用面试题集 有些补充略显臃肿,只为学习 1.activity的生命周期. 方法 描述 可被杀死 下一个 onCreate() 在activity第一次被创建的 ...
- 【Android面试】Android面试题集锦 (陆续更新)
[Android面试]Android面试题集锦 (陆续更新) 分类: [杂七杂八]2011-05-11 17:58 2064人阅读 评论(0) 收藏 举报 一些常见的Android面试基础题做下总结, ...
- Android之面试题总结加强版(一)
转载:http://blog.csdn.net/itachi85/article/details/7426451 自己总结的最强android应用面试题集 1.activity的生命周期. 方法 描述 ...
- 好全的Android面试题
转载:http://www.jianshu.com/p/84ee896c3329 需求描述 各种新技术接触渠道比较狭窄, 面试没有底气. 常见面试知识点及回答没有较系统的准备,就业指导提供的资料没时间 ...
- 前端笔试题小结(一)
前端笔试题小结(一) 2020-03-13 题目一: 将一个js数组去重. 样例: 输入:[ 1, "apple", 3, "a", 3, 1, 5, 6, & ...
最新文章
- 【组队学习】【26期】图神经网络
- mysql 5.7.16默认密码_(转)Ubuntu16安装mysql5.7未提示输入密码,安装后修改mysql默认密码...
- Python_基础_4
- JDK踩坑: Smart LocalDate
- 配置化的版本更新引导怎么做?
- python字典下标是什么_python列表、元组、字典
- 微服务架构的实施现状
- minecraft正版整合包服务器,我的世界1.7.2基佬整合包
- 1年工作经验8月份大厂面试全记录
- Statement与PreparedStatement的区别
- jsp mysql超市管理系统_jsp超市管理系统 基于jsp+servlet+MySQL的超市管理系统(带数据库) - 下载 - 搜珍网...
- centos下安装opencv
- Longest Valid Parentheses leetcode java
- wpf 切换搜狗输入法英文_搜狗输入法使用技巧整理,建议保存收藏
- rsync and inotify
- 查看oracle已使用表空间,查看Oracle的表空间的使用情况
- EDA365 V2.5下载
- 【Unity3D】Photon环境搭建
- 人脸识别数据集和特点
- 基于JavaScript实现的网页版贪吃蛇