妥妥的去面试之Android基础(六)

笔者由于在近期需要找工作,所以近期最主要的任务就是准备面试,不打无准备之仗。只有你准备充分了,那么你想得到的机会才可能有机会入你怀中。

笔者会将准备面试的学习过程记录下来,方便自己复盘的同时也希望能给一道找工作的小伙伴们一些帮助。笔者准备的内容大纲如下

Android面试大纲.png

妥妥的去面试之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)

面试系列的文章都放于 面试妥妥的 建议小伙伴们关注该专题

推荐阅读更多精彩内容