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

笔者因为在近期须要找工做,因此近期最主要的任务就是准备面试,不打无准备之仗。只有你准备充分了,那么你想获得的机会才可能有机会入你怀中。java

笔者会将准备面试的学习过程记录下来,方便本身复盘的同时也但愿能给一道找工做的小伙伴们一些帮助。笔者准备的内容大纲以下web

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)

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

相关文章
相关标签/搜索