笔者由于在近期需要找工作, 所以近期最主要的任务就是准备面试, 不打无准备之仗. 只有你准备充分了, 那么你想得到的机会才可能有机会入你怀中.
笔者会将准备面试的学习过程记录下来, 方便自己复盘的同时也希望能给一道找工作的小伙伴们一些帮助. 笔者准备的内容大纲如下
妥妥的去面试之 Android 基础 (一)
妥妥的去面试之 Android 基础 (二)
妥妥的去面试之 Android 基础 (三)
妥妥的去面试之 Android 基础 (四)
妥妥的去面试之 Android 基础 (五)
关于 Android 基础篇部分, 不出意外的话这篇应该是终结篇了~~
那么上最后的正菜吧
谈谈你对 MVC,MVP 和 MVVM 的理解
MVC 分三个层:
视图层 (View): 对应于 xml 布局文件和 java 代码动态 view 部分.
控制层 (Controller):MVC 中 Android 的控制层是由 Activity 来承担的, Activity 作为初始化页面, 展示数据的操作. 但是因为 xml 视图功能太弱, 所以 Activity 既要负责视图的显示又要加入控制逻辑, 承担的功能过多.
模型层 (Model): 针对业务模型, 建立数据结构和相关的类, 它主要负责网络请求, 数据库处理, I/O 的操作.
总结:
具有一定的分层, model 彻底解耦, controller 和 view 并没有解耦. Controller 既要承担页面的初始化又要处理控制逻辑, 承担的功能过多, 其代码量也会过多. Model 和 View 要直接交互, 它们耦合度依然更高.
MVP
MVP 在 MVC 的基础上, 引入了中间层 Present 把 Model 和 View 层彻底解耦, 由 Present 来控制逻辑, 解决了 MVC 中 Controller 和 View 分不清的问题. 但是随着业务逻辑的增加, 一个页面可能会非常复杂, UI 的改变是非常多, 会有非常多的 case, 这样就会造成 View 的接口会很庞大.
MVVM
MVP 中我们说过随着业务逻辑的增加, UI 的改变多的情况下, 会有非常多的跟 UI 相关的 case, 这样就会造成 View 的接口会很庞大. 而 MVVM 就解决了这个问题, 通过双向绑定的机制, 实现数据和 UI 内容, 只要想改其中一方, 另一方都能够及时更新的一种设计理念, 这样就省去了很多在 View 层中写很多 case 的情况, 只需要改变数据就行.
MVVM 与 DataBinding 的关系?
MVVM 是一种思想, DataBinding 是谷歌推出的方便实现 MVVM 的工具. 看起来 MVVM 很好的解决了 MVC 和 MVP 的不足, 但是由于数据和视图的双向绑定, 导致出现问题时不太好定位来源, 有可能数据问题导致, 也有可能业务逻辑中对视图属性的修改导致. 如果项目中打算用 MVVM 的话可以考虑使用官方的架构组件 ViewModel,LiveData,DataBinding 去实现 MVVM.
三者如何选择?
如果项目简单, 没什么复杂性, 未来改动也不大的话, 那就不要用设计模式或者架构方法, 只需要将每个模块封装好, 方便调用即可, 不要为了使用设计模式或架构方法而使用.
对于偏向展示型的 App, 绝大多数业务逻辑都在后端, App 主要功能就是展示数据, 交互等, 建议使用 mvvm.
对于工具类或者需要写很多业务逻辑 App, 使用 mvp 或者 mvvm 都可.
HttpClient 和 HttpUrlConnection 的区别?
HttpClient 适用于 web 浏览器, 拥有大量灵活的 API, 实现起来比较稳定, 且其功能比较丰富, 提供了很多工具, 封装了 http 的请求头. 但在不破坏兼容性的前提下, 其庞大的 API 也使人难以改进. 于是在 Android 6.0 中抛弃了 HttpClient, 替换成 OkHttp.
HttpUrlConnection 它的 API 简单, 体积较小, 因而非常适用于 Android 项目. 压缩和缓存机制可以有效地减少网络访问的流量, 在提升速度和省电方面也起到了较大的作用. 对于新的应用程序应该使用 HttpURLConnection.
invalidate 和 requestLayout 的区别及使用?
invalidate(): 是自定义 View 的时候, 重新执行 onDraw() 方法, 当 view 只在内容和可见度方面发生变化时调用.
requeLayout() : 他跟 invalidate() 相反, 他只调用 measure() 和 layout() 过程, 不会调用 draw().
如果需要局部刷新怎么办?
使用 requestFocus() 方法, 他只刷新你要刷新的地方.
Android 对 HashMap 做了优化后推出的新的容器类是什么?
比如使用了 SparseArray,ArrayMap 用来代替 HashMap. 它们在有些情况下能带来更好的性能提升.
SparseArray
SparseArray 比 HashMap 更省内存, 在某些条件下性能更好, 主要是因为它避免了对 key 的自动装箱 (int 转为 Integer 类型), 它内部则是通过两个数组来进行数据存储的, 一个存储 key, 另外一个存储 value, 为了优化性能, 它内部对数据还采取了压缩的方式来表示稀疏数组的数据, 从而节约内存空间.
SparseArray 在存储和读取数据时候, 使用的是二分查找法.
满足下面两个条件我们可以使用 SparseArray 代替 HashMap:
数据量不大, 最好在千级以内
key 必须为 int 类型, 这中情况下的 HashMap 可以用 SparseArray 代替
建议与此篇博客共同食用 Android 内存优化 (使用 SparseArray 和 ArrayMap 代替 HashMap)
面试系列的文章都放于 面试妥妥的 https://www.jianshu.com/c/d02f8a9f8f8b 建议小伙伴们关注该专题
来源: https://juejin.im/post/5c7fe0e4e51d4541d82d9cd6