2019年10月份android面试的一些总结

一共面了7家,拿个4个offer,但是都不是很理想。
其中有两家上市公司都没有通过,感觉挺遗憾的。

也奉劝大家一句,能去大公司尽量去大公司、大平台,对自己以后的发展和提升帮助还是挺大的。

以后有机会出去面面试,真的是对自己技术和能力的查漏补缺。

两家上市公司是
  • 茄子快传
    聊了2个多小时,最后还是回去等通知,主要是问了一些问题的解决方案。
    他们项目是全球化的,所以有想去面试的要充分了解一下android的语言适配、view的
    rtl属性。其他就是一些

  • 汽车之家
    这边问的深度比较大,像是组件化,插件化这些一定要好好掌握。这家还要求掌握RN。其他下面会总结一些。

小插曲
  • 最右
    入职之后,晚上还抽空去面了下最右
    这边主要是先刷一套题,具体题目没仔细记。
    有一个是清除 listview 里面的为 3 的所有item。(Iterator的用法)
    还有一个是手写 成比例高度的自定义控件。
    备注:面试官很nice

java基础

看这里
https://blog.csdn.net/u013728021/article/details/103239660

Android方面

1. android中的png和jpg的区别和使用场景
pngjpg
中文名便携式网络图型联合图像专家组
原名Portable Network GraphicsJoint Photographic Experts Group
压缩形式无损有损
体积大小偏大
通道方式有透明通道无透明通道
使用场景及原因app包中的图片,使用png格式的(由于android系统对png格式有硬件加速)1. 网络上加载的图片,使用jpg格式(图片体积小,节流) 2.背景图、引导页,这种大尺寸的图片,倾向于jpg格式(图片体积小,减小安装包体积)

具体参考 https://www.zhihu.com/question/29758228

为什么png能实现无损压缩
png采用的是argb压缩形式,每一个像素点都argb都会被精确保留下来。
采用的算法是LZ77(映射方式)和哈夫曼编码(最优编码方式),减小图片的内存大小。
https://juejin.im/post/5c8e4feb6fb9a070aa5ce200

为什么jpg是有损压缩
jpg压缩是根据人眼识别的特点把图像分成Y(亮度)Cb(色度蓝)Cr(色度红)的形式。
由于人眼对亮度要比后面两者感应强烈,所以主要针对Cb和Cr进行压缩处理,减少粒度感,是有损压缩。
https://www.jianshu.com/p/934269064bfb

2. android图像显示的底层原理

在这里插入图片描述
CPU它的作用是计算图片的形状和文字的纹体

GPU它的功能是渲染图像的颜色

Display屏幕显示图像

VSync显卡输出频率与屏幕刷新频率同步

过程

首先是CPU计算出图像形状,计算完成CPU会将图像交给GPU渲染出颜色,如果这一切都能够在16ms内完成,那么在下一个VSync出现时,就能显示刚刚渲染出来的那1帧图像了,但是如果CPU和GPU处理1帧图像时间超过16ms,那么这帧图像只能等到第2个VSync出现时才能刷出屏幕,呈现给用户了,这也就意味着用户在32ms内所看到的是同1帧的图像,这就是所谓的掉帧,也就是卡顿了。

从代码层面上来看,到底是哪些因素使得CPU,GPU处理图像时间过长呢?

  1. 过度重绘,有时候是因为你的UI布局存在大量重叠的部分,还有的时候是因为非必须的重叠背景。例如某个Activity有一个背景,然后里面的Layout又有自己的背景,同时子View又分别有自己的背景。仅仅是通过移除非必须的背景图片,这就能够减少大量的红色Overdraw区域。

  2. 动画使用次数过多。
    通常情况下Android需要将xml布局文件转换成GPU可以识别的绘制对象,而这些绘制对象被存放到DisplayList的数组中,当view第一次绘制的时候DisplayList被创建,view第二次绘制的时候GPU就直接从DisplayList获取绘制对象,省去了Measure,Layout的时间,但是如果我们改变了view的绘制内容那么得重新Measure,layout,DisplayList也会被重新创建,这么看来动画效果是非常消耗性能的。因为它必须经过多次重绘。

  3. 短时间内创建的对象过多
    android的垃圾回收机制是,当heap被占用的空间达到一个阈值,GC就开始回收对象了,GC工作的时候大部分线程是阻塞的,所以如果GC耗时超过16ms那么也会出现失帧卡顿的现象。

3. ViewGroup的层级深度

这里就是一个DFS(深度优先遍历)算法

private int maxDeep(View view) {
        //当前的view已经是最底层view了,不能往下累加层数了,返回0,代表view下面只有0层了
        if (!(view instanceof ViewGroup)) {
            return 0;
        }
        ViewGroup vp = (ViewGroup) view;
        //虽然是viewgroup,但是如果并没有任何子view,那么也已经是最底层view了,不能往下累加层数了,返回0,代表view下面只有0层了
        if (vp.getChildCount() == 0) {
            return 0;
        }
        //用来记录最大层数
        int max = 0;
        //广度遍历view
        for (int i = 0; i < vp.getChildCount(); i++) {
            //由于vp拥有子view,所以下面还有一层,因为可以+1,来叠加一层,然后再递归几岁算它的子view的层数
            int deep = maxDeep(vp.getChildAt(i)) + 1;
            //比较哪个大就记录哪个
            if (deep > max) {
                max = deep;
            }
        }
        return max;
    }
4. HTTP连接

HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用。

HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。

1)在HTTP 1.0中,客户端的每次请求都要求建立一次单独的连接,在处理完本次请求后,就自动释放连接。

2)在HTTP 1.1中则可以在一次连接中处理多个请求,并且多个请求可以重叠进行,不需要等待一个请求结束后再发送下一个请求。

由于HTTP在每次请求结束后都会主动释放连接,因此HTTP连接是一种“短连接”,要保持客户端程序的在线状态,需要不断地向服务器发起连接请求。

通常的做法是即使不需要获得任何数据,客户端也保持每隔一段固定的时间向服务器发送一次“保持连接”的请求,服务器在收到该请求后对客户端进行回复,表明知道客户端“在线”。

若服务器长时间无法收到客户端的请求,则认为客户端“下线”,若客户端长时间无法收到服务器的回复,则认为网络已经断开。

5. http中get和post区别
postget
参数一般放在form表单中拼接在url上
特点一般用来更新服务器资源,不安全且不幂等安全且幂等(一般不会造成服务器资源的改变)

后期会总结一遍关于http的详细文章。

七层协议

注意:

这里有个变态的面试官为了一个 数据链路层 有什么协议。

OSI中的层功能TCP/IP协议族
应用层文件传输,电子邮件,文件服务,虚拟终端TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet
表示层数据格式化,代码转换,数据加密没有协议
会话层解除或建立与别的接点的联系没有协议
传输层提供端对端的接口TCP,UDP
网络层为数据包选择路由IP,ICMP,RIP,OSPF,BGP,IGMP
数据链路层传输有地址的帧以及错误检测功能SLIP,CSLIP,PPP,ARP,RARP,MTU
物理层以二进制数据形式在物理媒体上传输数据ISO2110,IEEE802。IEEE802.2
什么是socket

套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。

应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题。
多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。
为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(Socket)接口。
应用层可以和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。

如果一个程序创建了一个socket,并让其监听80端口,其实是向TCP/IP协议栈声明了其对80端口的占有。以后,所有目标是80端口的TCP数据包都会转发给该程序(这里的程序,因为使用的是Socket编程接口,所以首先由Socket层来处理)。

所谓accept函数,其实抽象的是TCP的连接建立过程。accept函数返回的新socket其实指代的是本次创建的连接,而一个连接是包括两部分信息的,一个是源IP和源端口,另一个是宿IP和宿端口。

所以,accept可以产生多个不同的socket,而这些socket里包含的宿IP和宿端口是不变的,变化的只是源IP和源端口。

这样的话,这些socket宿端口就可以都是80,而Socket层还是能根据源/宿对来准确地分辨出IP包和socket的归属关系,从而完成对TCP/IP协议的操作封装!

而同时,放火墙的对IP包的处理规则也是清晰明了,不存在前面设想的种种复杂的情形。

明白socket只是对TCP/IP协议栈操作的抽象,而不是简单的映射关系,这很重要!

TCP的三次握手和四次挥手

在这里插入图片描述
https://blog.csdn.net/u013728021/article/details/85261708

WebSocket的简单理解

这个协议是用来帮助客户端进行和服务器进行长链接的协议。
比传统的ajax和long poll性能和处理方式都要好。

具体参考下面链接
https://blog.csdn.net/u013728021/article/details/102727297

android端okhttp完美支持websocket通信,具体可搜索,实现起来也比较简单。

客户端HTTP请求优化实战

这个问题是面试汽车之家android高级开发的时候被问到的一个问题,当时没有答出来,惭愧惭愧

主要针对

  • DNS解析问题
  • 在业务层面尽量合并接口
  • 自动重发机制
  • 针对不同的网络状态动态调整timeou

https://blog.csdn.net/u013728021/article/details/102819646

Android的事件分发机制

事件分发主要分三块:分发、拦截、消费;
当我们触摸到屏幕的时候,默认会先走Activity的分发,接着走ViewGroup的分发,然后到ViewGroup的拦截,后面再到View的分发事件,最后会传到View的消费事件,如果View不消费,紧接着回传到ViewGroup的消费事件,如果ViewGroup也不消费,最后回到View的消费事件。整个事件分发构成了一个u型结构,下面总结了分发的细节流程:

在action_down的时候,首先去判断viewgroup的onInterceptTouchEvent是不是拦截了,
如果拦截的话intercepted=true,

就会走handled = dispatchTransformedTouchEvent(ev, canceled, null, TouchTarget.ALL_POINTER_IDS);方法,

此处传的child是null,因此直接走super.dispatchTouchEvent方法,不走child的dispatchTouchEvent方法

如果onInterceptTouchEvent不拦截,那么在action_down的时候,去获取child.dispatchTouchEvent方法,如果返回true,那么mFirstTouchTarget和newTouchTarget都不为空,因此在action_move和action_up的时候会走child的dispatchTouchEvent和ontouchEvent方法

如果child的dispatchTouchEvent方法返回false或者child的ontouchEvent返回false,mFirstTouchTarget和newTouchTarget都为空,因此在action_move和action_up的时候不走child的dispatchTouchEvent和ontouchEvent方法。

如果点击的是viewgroup,那么viewgroup的onInterceptTouchEvent的action_move和action_up都不会被执行。

Activity的事件分发机制
https://blog.csdn.net/u013728021/article/details/102826314
ViewGroup的事件分发机制
https://blog.csdn.net/u013728021/article/details/102831095
View的事件分发机制
https://blog.csdn.net/u013728021/article/details/102826446

  • 7
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值