Android开发五年,面试阿里才发现这些知识点没完全掌握;你知
第一次观看我文章的朋友,可以关注,点赞,转发一下,每天分享各种干货技术和程序猿趣事
前言
工作五六年了,一路磕磕绊绊从小厂走到大厂,大大小小的面试也经历了不少,也有一些经验。下面我整理了一下历来面试所遇到的面试内容,内容包含:Android学习PDF+架构视频+最新面试文档+源码笔记 这几块的内容。免费分享给大家,非常适合有这些困惑的朋友。也是希望可以帮助到大家提升进阶,有需要的可以私信我【资料】领取。
好了话不多说下面我们进入正题!
正文
网络优化
移动端获取网络数据优化的几个点
1、连接复用:节省连接建立时间,如开启 keep-alive。于Android来说默认情况下
HttpURLConnection和HttpClient都开启了keep-alive。只是2.2之前HttpURLConnection存在影
响连接池的Bug。
2、请求合并:即将多个请求合并为一个进行请求,比较常见的就是网页中的CSS Image Sprites。
如果某个页面内请求过多,也可以考虑做一定的请求合并。
3、减少请求数据的大小:对于post请求,body可以做gzip压缩的,header也可以做数据压缩(不
过只支持http 2.0)。
返回数据的body也可以做gzip压缩,body数据体积可以缩小到原来的30%左右(也可以考虑压缩
返回的json数据的key数据的体积,尤其是针对返回数据格式变化不大的情况,支付宝聊天返回的
数据用到了)。
4、根据用户的当前的网络质量来判断下载什么质量的图片(电商用的比较多)。
5、使用HttpDNS优化DNS:DNS存在解析慢和DNS劫持等问题,DNS 不仅支持 UDP,它还支持
TCP,但是大部分标准的 DNS 都是基于 UDP 与 DNS 服务器的 53 端口进行交互。HTTPDNS 则不
同,顾名思义它是利用 HTTP 协议与 DNS 服务器的 80 端口进行交互。不走传统的 DNS 解析,从
而绕过运营商的 LocalDNS 服务器,有效的防止了域名劫持,提高域名解析的效率。
内存抖动(代码注意事项):
内存抖动是由于短时间内有大量对象进出新生区导致的,它伴随着频繁的GC,gc会大量占用ui线程和
cpu资源,会导致app整体卡顿。
避免发生内存抖动的几点建议:
- 尽量避免在循环体内创建对象,应该把对象创建移到循环体外。
- 注意自定义View的onDraw()方法会被频繁调用,所以在这里面不应该频繁的创建对象。
- 当需要大量使用Bitmap的时候,试着把它们缓存在数组或容器中实现复用。
- 对于能够复用的对象,同理可以使用对象池将它们缓存起来。
为什么WebView加载会慢呢?
这是因为在客户端中,加载H5页面之前,需要先初始化WebView,在WebView完全初始化完成之前,
后续的界面加载过程都是被阻塞的。优化手段围绕着以下两个点进行:
- 预加载WebView。
- 加载WebView的同时,请求H5页面数据。
因此常见的方法是:
- 全局WebView。
- 客户端代理页面请求。WebView初始化完成后向客户端请求数据。
- asset存放离线包。
除此之外还有一些其他的优化手段:
- 脚本执行慢,可以让脚本最后运行,不阻塞页面解析。
- DNS链接慢,可以让客户端复用使用的域名与链接。
- React框架代码执行慢,可以将这部分代码拆分出来,提前进行解析。
FC(Force Close)什么时候会出现?
Error、OOM,StackOverFlowError、Runtime,比如说空指针异常
解决的办法:
- 注意内存的使用和管理
- 使用Thread.UncaughtExceptionHandler接口
如何解决View的事件冲突?
常见开发中事件冲突的有ScrollView与RecyclerView的滑动冲突、RecyclerView内嵌同时滑动同一方
向。
滑动冲突的处理规则:
-
对于由于外部滑动和内部滑动方向不一致导致的滑动冲突,可以根据滑动的方向判断谁来拦截事件。
-
对于由于外部滑动方向和内部滑动方向一致导致的滑动冲突,可以根据业务需求,规定何时让外部View拦截事件,何时由内部View拦截事件。
-
对于上面两种情况的嵌套,相对复杂,可同样根据需求在业务上找到突破点。
滑动冲突的实现方法:
-
外部拦截法:指点击事件都先经过父容器的拦截处理,如果父容器需要此事件就拦截,否则就不拦截。具体方法:需要重写父容器的onInterceptTouchEvent方法,在内部做出相应的拦截。
-
内部拦截法:指父容器不拦截任何事件,而将所有的事件都传递给子容器,如果子容器需要此事件就直接消耗,否则就交由父容器进行处理。需要配合requestDisallowInterceptTouchEvent方法
Draw的基本流程
绘制基本上可以分为六个步骤:
- 首先绘制View的背景;
- 如果需要的话,保持canvas的图层,为fading做准备;
- 然后,绘制View的内容;
- 接着,绘制View的子View;
- 如果需要的话,绘制View的fading边缘并恢复图层;
- 最后,绘制View的装饰(例如滚动条等等)。
setWillNotDraw的作用
如果一个View不需要绘制任何内容,那么设置这个标记位为true以后,系统会进行相应的优化。
-
默认情况下,View没有启用这个优化标记位,但是ViewGroup会默认启用这个优化标记位。
-
当我们的自定义控件继承于ViewGroup并且本身不具备绘制功能时,就可以开启这个标记位从而便于系统进行后续的优化。
-
当明确知道一个ViewGroup需要通过onDraw来绘制内容时,我们要显示地关闭WILL_NOT_DRAW这个标记位。
invalidate() 和 postInvalidate()的区别 ?
invalidate()与postInvalidate()都用于刷新View,主要区别是invalidate()在主线程中调用,若在子线程
中使用需要配合handler;而postInvalidate()可在子线程中直接调用
数据库的四大特征,数据库的隔离级别?
数据库的四大特征:
-
原子性(Atomicity):原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚。
-
一致性(Consistency):一个事务执行之前和执行之后都必须处于一致性状态。
-
隔离性(Isolation):隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
-
持久性(Durability):持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的。
数据库的隔离级别:
- Serializable(串行化):可避免脏读、不可重复读、幻读的发生。
- Repeatable read (可重复读):可避免脏读、不可重复读的发生。
- Read committed (读已提交):可避免脏读的发生。
- Read uncommitted (读未提交):最低级别,任何情况都无法保证。
文末
好了,由于内容太多文章篇幅有限,今天的分享就到这里了,有需要完整资料的朋友可以私信我【资料】免费获取或者点这里
还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
【Android核心高级技术PDF文档,BAT大厂面试真题解析】
【Android必备核心知识点】