美文网首页Android开发Android开发经验谈Android技术知识
Android开发五年,面试阿里才发现这些知识点没完全掌握;你知

Android开发五年,面试阿里才发现这些知识点没完全掌握;你知

作者: 4ca1bbef6a0c | 来源:发表于2020-05-18 17:39 被阅读0次

第一次观看我文章的朋友,可以关注,点赞,转发一下,每天分享各种干货技术和程序猿趣事

前言

工作五六年了,一路磕磕绊绊从小厂走到大厂,大大小小的面试也经历了不少,也有一些经验。下面我整理了一下历来面试所遇到的面试内容,内容包含: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 服务器,有效的防止了域名劫持,提高域名解析的效率。

image

内存抖动(代码注意事项):

内存抖动是由于短时间内有大量对象进出新生区导致的,它伴随着频繁的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+架构视频+最新面试文档+源码笔记

【Android核心高级技术PDF文档,BAT大厂面试真题解析】

【Android必备核心知识点】

相关文章

网友评论

    本文标题:Android开发五年,面试阿里才发现这些知识点没完全掌握;你知

    本文链接:https://www.haomeiwen.com/subject/lmxpohtx.html