学习自

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面试题小结相关推荐

  1. Android 面试题笔记(一)

    每日更新每日学习面试笔记,来自https://github.com/Moosphan/Android-Daily-Interview/ 1.自定义 Handler 时如何有效地避免内存泄漏问题? 问题 ...

  2. linux c语言常见面试题及答案,Linux下C语言的几道经典面试题小结(分享)

    Linux下C语言的几道经典面试题小结(分享) 本篇文章整理了几道Linux下C语言的经典面试题,相信对大家更好的理解Linux下的C语言会有很大的帮助,欢迎大家探讨指正. 1.如果在Linux下使用 ...

  3. Android 基本面试题

    Android 基本面试题 一.java 核心思想 1.八种基本数据类型和封装类 基本类型 大小(字节) byte 1 short 2 int 4 long 8 float 4 double 8 bo ...

  4. 【Android面试】Android面试题集锦 (陆续更新)(最新2012-6-18)

    1.android开发新浪面试题[开发者必看哦] 下载地址 http://www.eoeandroid.com/thread-177885-1-1.html 2.华为关于android笔试题案例解析 ...

  5. android面试题总结加强

    在加强版的基础上又再加强的android应用面试题集 有些补充略显臃肿,只为学习 1.activity的生命周期. 方法 描述 可被杀死 下一个 onCreate() 在activity第一次被创建的 ...

  6. 【Android面试】Android面试题集锦 (陆续更新)

    [Android面试]Android面试题集锦 (陆续更新) 分类: [杂七杂八]2011-05-11 17:58 2064人阅读 评论(0) 收藏 举报 一些常见的Android面试基础题做下总结, ...

  7. Android之面试题总结加强版(一)

    转载:http://blog.csdn.net/itachi85/article/details/7426451 自己总结的最强android应用面试题集 1.activity的生命周期. 方法 描述 ...

  8. 好全的Android面试题

    转载:http://www.jianshu.com/p/84ee896c3329 需求描述 各种新技术接触渠道比较狭窄, 面试没有底气. 常见面试知识点及回答没有较系统的准备,就业指导提供的资料没时间 ...

  9. 前端笔试题小结(一)

    前端笔试题小结(一) 2020-03-13 题目一: 将一个js数组去重. 样例: 输入:[ 1, "apple", 3, "a", 3, 1, 5, 6, & ...

最新文章

  1. 【组队学习】【26期】图神经网络
  2. mysql 5.7.16默认密码_(转)Ubuntu16安装mysql5.7未提示输入密码,安装后修改mysql默认密码...
  3. Python_基础_4
  4. JDK踩坑: Smart LocalDate
  5. 配置化的版本更新引导怎么做?
  6. python字典下标是什么_python列表、元组、字典
  7. 微服务架构的实施现状
  8. minecraft正版整合包服务器,我的世界1.7.2基佬整合包
  9. 1年工作经验8月份大厂面试全记录
  10. Statement与PreparedStatement的区别
  11. jsp mysql超市管理系统_jsp超市管理系统 基于jsp+servlet+MySQL的超市管理系统(带数据库) - 下载 - 搜珍网...
  12. centos下安装opencv
  13. Longest Valid Parentheses leetcode java
  14. wpf 切换搜狗输入法英文_搜狗输入法使用技巧整理,建议保存收藏
  15. rsync and inotify
  16. 查看oracle已使用表空间,查看Oracle的表空间的使用情况
  17. EDA365 V2.5下载
  18. 【Unity3D】Photon环境搭建
  19. 人脸识别数据集和特点
  20. 基于JavaScript实现的网页版贪吃蛇

热门文章

  1. vue加载图片失败解决方法
  2. Internet共享打印机流程
  3. 第一个小游戏,被我卖了。。。
  4. esp8266/32~资源帖[持续更新]
  5. Ubuntu快速删除大量小文件方法
  6. 我们程序员真的如此不堪吗?
  7. word从任意页插入页码
  8. 微积分的本质(五):指数函数求导
  9. BZOJ 1567 [JSOI2008]Blue Mary的战役地图【二分答案】
  10. 单链表:带头结点和不带头结点 总结