这些Android面试题你还会做吗?

     最近在给公司招聘3年以下经验的android开发人员,趁这个机会整理下一些基本的面试题,不是很多,我个人觉得比较典型的,时间长了一些不常用的细节问题都快忘记了,也许是轮子用多了吧,如果能在赶项目进度的时候抽出时间,总结回顾下一些知识,也是很不错的,没事的时候自己写写轮子,会有意想不到的收获。       招聘信息发出去很久了,居然没收到几份简历,当然薪资在行业内是具有竞争力的,我很诧异,难道现在行情这么好,都不缺工作吗?还是行情不好入行做android的少了?导致3年以下的开发人员逐渐减少,所以我发起投票,想分析下,看看 都是几年的大神啊,总结完了会跟大家分享,谢谢参与!嘿嘿,有什么想法欢迎在留言区留言

下边是面试题:

1、导致内存泄露的原因有哪些?

内存泄露的根本原因:长生命周期的对象持有短生命周期的对象。短周期对象就无法及时释放。

静态内部类非静态内部类的区别(Handler 引起的内存泄漏。)

静态集合类引起内存泄露

单例模式引起的内存泄漏。

解决:ContextApplicationContext,由于ApplicationContext的生命周期是和app一致的,不会导致内存泄漏

注册/反注册未成对使用引起的内存泄漏。

集合对象没有及时清理引起的内存泄漏。通常会把一些对象装入到集合中,当不使用的时候一定要记得及时清理集合,让相关对象不再被引用。

 内存分析工具的使用

 

减少内存对象的占用

I.ArrayMap/SparseArray代替hashmap

II.避免在android里面使用Enum

III.减少bitmap的内存占用

inSampleSize:缩放比例,在把图片载入内存之前,我们需要先计算出一个合适的缩放比例,避免不必要的大图载入。

decode format:解码格式,选择ARGB_8888/RBG_565/ARGB_4444/ALPHA_8,存在很大差异。

IV.减少资源图片的大小,过大的图片可以考虑分段加载

 

2、理解ActivityView,Window三者关系

这个问题真的很不好回答。所以这里先来个算是比较恰当的比喻来形容下它们的关系吧。Activity像一个工匠(控制单元),Window像窗户(承载模型),View像窗花(显示视图)LayoutInflater像剪刀,Xml配置像窗花图纸。

1Activity构造的时候会初始化一个Window,准确的说是PhoneWindow

2:这个PhoneWindow有一个“ViewRoot”,这个“ViewRoot”是一个View或者说ViewGroup,是最初始的根视图。

3“ViewRoot”通过addView方法来一个个的添加View。比如TextViewButton

4:这些View的事件监听,是由WindowManagerService来接受消息,并且回调Activity函数。比如onClickListeneronKeyDown等。

3Handler的原理

所以就有了handler,它的作用就是实现线程之间的通信。

handler整个流程中,主要有四个对象,handlerMessage,MessageQueue,Looper。当应用创建的时候,就会在主线程中创建handler对象,

我们通过要传送的消息保存到Message中,handler通过调用sendMessage方法将Message发送到MessageQueue中,Looper对象就会不断的调用loop()方法

不断的从MessageQueue中取出Message交给handler进行处理。从而实现线程之间的通信。

4ViewViewGroup事件分发

1. Touch事件分发中只有两个主角:ViewGroupViewViewGroup包含onInterceptTouchEventdispatchTouchEventonTouchEvent三个相关事件。View包含dispatchTouchEventonTouchEvent两个相关事件。其中ViewGroup又继承于View

2.ViewGroupView组成了一个树状结构,根节点为Activity内部包含的一个ViwGroup

3.触摸事件由Action_DownAction_MoveAciton_UP组成,其中一次完整的触摸事件中,DownUp都只有一个,Move有若干个,可以为0个。

4.Acitivty接收到Touch事件时,将遍历子View进行Down事件的分发。ViewGroup的遍历可以看成是递归的。分发的目的是为了找到真正要处理本次完整触摸事件的View,这个View会在onTouchuEvent结果返回true

5.当某个子View返回true时,会中止Down事件的分发,同时在ViewGroup中记录该子View。接下去的MoveUp事件将由该子View直接进行处理。由于子View是保存在ViewGroup中的,多层ViewGroup的节点结构时,上级ViewGroup保存的会是真实处理事件的View所在的ViewGroup对象:ViewGroup0-ViewGroup1-TextView的结构中,TextView返回了true,它将被保存在ViewGroup1中,而ViewGroup1也会返回true,被保存在ViewGroup0中。当MoveUP事件来时,会先从ViewGroup0传递至ViewGroup1,再由ViewGroup1传递至TextView

6.ViewGroup中所有子View都不捕获Down事件时,将触发ViewGroup自身的onTouch事件。触发的方式是调用super.dispatchTouchEvent函数,即父类ViewdispatchTouchEvent方法。在所有子View都不处理的情况下,触发AcitivityonTouchEvent方法。

7.onInterceptTouchEvent有两个作用:1.拦截Down事件的分发。2.中止UpMove事件向目标View传递,使得目标View所在的ViewGroup捕获UpMove事件。

5onNewIntent()什么时候调用?(singleTask)

6mvc mvp mvvm

·  1.mvc:数据、ViewActivityView将操作反馈给ActivityActivitiy去获取数据,数据通过观察者模式刷新给View。循环依赖

1.Activity重,很难单元测试

2.ViewModel耦合严重

·  2.mvp:数据、ViewPresenterView将操作给PresenterPresenter去获取数据,数据获取好了返回给PresenterPresenter去刷新ViewPVPM双向依赖

1.接口爆炸

2.Presenter很重

·  3.mvvm:数据、ViewViewModelView将操作给ViewModelViewModel去获取数据,数据和界面绑定了,数据更新界面更新。

1.viewModel的业务逻辑可以单独拿来测试

2.一个view 对应一个 viewModel 业务逻辑可以分离,不会出现全能类

3.数据和界面绑定了,不用写垃圾代码,但是复用起来不舒服

7、自定义控件

View的绘制流程:OnMeasure()——>OnLayout()——>OnDraw()

第一步:OnMeasure():测量视图大小。从顶层父View到子View递归调用measure方法,measure方法又回调OnMeasure

第二步:OnLayout():确定View位置,进行页面布局。从顶层父View向子View的递归调用view.layout方法的过程,即父View根据上一步measureView所得到的布局大小和布局参数,将子View放在合适的位置上。 

第三步:OnDraw():绘制视图。ViewRoot创建一个Canvas对象,然后调用OnDraw()。六个步骤:、绘制视图的背景;、保存画布的图层(Layer);、绘制View的内容;、绘制View子视图,如果没有就不用;

、还原图层(Layer);、绘制滚动条。

8SerializableParcelable 的区别

1.P 消耗内存小

2.网络传输用S 程序内使用P

3.S将数据持久化方便

4.S使用了反射 容易触发垃圾回收 比较慢

 

有补充的欢迎留言,我会分享给大家!

                        喜欢 就关注吧,欢迎投稿!

640?wx_fmt=jpeg


 

 

本网站文章均为原创内容,并可随意转载,但请标明本文链接
如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: https://leetcode.jp/这些android面试题你还会做吗?/

此条目发表在Android分类目录。将固定链接加入收藏夹。

发表评论

您的电子邮箱地址不会被公开。