面试理论

Android中高级开发工程师-面试记录-长期更新(二)

2021-05-30  本文已影响0人  肖义熙

由于篇幅原因,接上面的一篇继续:Android中高级开发工程师-面试记录-长期更新

JD一面 2021-05-26 20:30 电话面试

1、Kotlin和Java的运算符可以重载么?协程和线程的区别
2、自定义View和自定义ViewGroup的区别
3、onMeasure、onLayout、onDraw方法的先后顺序,有没有哪些方法可以触发执行,invalidate、layout、postinvalidate方法,还有没有其他方法经常需要重写?
4、性能调优方面的理解
5、SVG可以修改图片的颜色么?webp的使用有哪些限制?
6、同一个图片放到不同文件夹下加载到内存的大小是一样的么?
7、MVVM和MVP的一些区别,讲讲你理解的MVVM
8、头条适配方案的原理讲讲,是怎么动态修改density的
9、AIDL简单讲解一下。底层实现的是什么机制?
10、Binder机制了解
11、Handler的机制,详细的
12、关于Handler有一个需求,一个消息要立刻执行,要怎么做?
13、Handler同步屏障异步消息的概念的理解
14、平时工作有处理过OOM的问题么?系统抛出OOM的原因有哪些
15、Android系统在内存不足时,依据什么来杀掉一些应用的?

1、Kotlin的运算符可以重载么?协程和线程的区别?

答:

2、自定义View和自定义ViewGroup的区别

答:自定义View和自定义ViewGroup的区别主要在与onLayout方法的重写吧,自定义ViewGroup需要对子View 进行布局的一个操作,所以需要重写onLayout方法。自定义View和自定义ViewGroup,他们都需要进行测量和绘制,ViewGroup不仅需要测量自身,还要调用measureChild方法去循环子View并对子View进行测量,同时他们也都需要重写onDraw方法,onDraw方法会经常被调用,所以需要尽量避免在onDraw方法中创建对象。

3、onMeasure、onLayout、onDraw方法的先后顺序,有没有哪些方法可以触发执行,invalidate、layout、postinvalidate方法,还有没有其他方法经常需要重写?

答:他们的先后顺序是onMeasure、onLayout、onDraw,也就是先测量,才知道应该布局在哪里,之后才会进行绘制的操作。postinvalidate和invalidate的主要区别就是postinvalidate方法实现了Handler消息机制,可以让开发者在非UI线程也能调用刷新View的方法,最终还是调用到了invalidate方法。invalidate方法最终会回调到onDraw方法,而要回调onMeasure方法和onLayout方法的话可以使用requestLayout。也就是说,如果View只是需要重新绘制而没有改变位置的话,可以使用invalidate(非UI线程可以使用postinvalidate方法),如果View的位置发生了变化的话,可以使用RequestLayout方法。自定义View/ViewGroup的过程中,还有onSizeChanged()、onFinishInflate()这两个方法也是经常重写的方法吧,onFinishInflate方法只有在布局文件中加载View实例的时候会回调这个方法,如果使用new的方式不会回调这个方法,这个方法会在onMeasure方法之前调用。onSizeChanged方法一般是在视图大小发生改变的时候回调,之后回调onlayout方法进行重新布局。


总结一下:自定义View时,最主要重写onMeasure()、onDraw方法,还有经常重写的还有onSizeChanged(),自定义ViewGroup时,比自定义View多一个onLayout方法,onFinishInflate()重写的不多倒是,要了解一下invalidate()、postinvalidate()、requestLayout()方法的作用,还有onDraw方法中的paint、path、canves等类

4、你做过哪些性能调优方面的优化,或者你没做过,了解过的也可以讲讲。

答:内存优化方面主要是有几个方面的吧,APP端给用户最为直观的感受就是APP启动快慢、使用时页面流畅度、下载的时候安装包的体积、使用过程中的稳定性(奔溃/ANR)、然后现在用户比较关心的就是耗电量(这个就和个人的一些代码习惯上有一些关系了,包括对内存、算法等等)
我在项目中做过的有:

5、SVG可以修改图片的颜色么?webp的使用有哪些限制?

答:SVG可以修改图片颜色,SVG是一个xml格式的,可以手动修改里面的一个fillColor属性,或者也可以使用代码动态的修改颜色,主要是通过setTint方法来修改的。SVG使用上,在5.0以下需要在gradle里面配置允许使用。在Android 4.0(API level 14)中支持有损的WebP图像,在Android 4.3(API level 18)和更高版本中支持无损和透明的WebP图像,但是目前来看 6.0以下的手机应该都比较少了吧,我感觉甚至可以放弃支持4.0的适配了。

6、同一个图片放到不同文件夹下加载到内存的大小是一样的么?

这个请看我的另外一篇文章,里面详细解释了图片加载到内存中是怎么计算内存大小以及放到不同文件夹下加载到内存中的大小是怎么样的。Bitmap相关
这里给一个结论吧:

7、MVVM和MVP的一些区别,讲讲你理解的MVVM

这里其实主要说一下自己的见解,也没什么标准答案吧
答:MVVM主要是基于数据的双向绑定及观察者模式来实现的,MVP主要是通过共同实现一个View接口来实现的,MVP模式下处理不妥当的话,有可能造成内存的泄漏,因为都持有了View的一个引用。MVVM比MVP来讲更加的解耦,同时写法上也感觉更加的简便。感觉要是简单的项目,就用MVC来做来,复杂点的还是MVVM的优势较大,这个是我个人的一个感受。对于这个问题来讲,其实没有好坏之分,只有合适与不合适的说法,就是存在即有意义。

8、头条适配方案的原理讲讲,它是怎么动态修改density的

答:我们常用的 px 转 dp 的公式 dp = px / density,头条的适配方案其实就是动态计算density的值,根据设计稿的dp值,来动态计算在每个手机上的density的值,也就能得到相应的px的值。比如一个540dp的设计稿,在1080px手机上时,算出来的density值为 1080/540 = 2,在540px手机上时,算出来的density值为:540/540 = 1,假如一个View的宽度为50dp,那在1080px手机上所占用的像素就为50dp = 100px,在540px手机上所占像素为50dp= 50px,则它们的 百分比值是相等的 100/1080 = 50/540。
这个density是DisplayMetrics类中的属性,实际上是在要修改的页面中的onCreate方法setContentView方法前进行修改或者通过application中进行修改,application中修改就是全局的,其他页面不需要适配的话就可以在其他页面上重新进行修改这个值就好。

9、AIDL简单讲解一下。底层实现的是什么机制?

答:AIDL是进程间通信的一种方式,底层实现是通过Binder机制来实现的。Binder机制底层又是通过mmap内存映射原理来实现的,内存分为用户空间和内核空间,Binder机制通过一次一次的数据拷贝来传递数据。

10、Binder机制了解

答:每个进程的内存空间都分为用户空间和内核空间,用户空间和内核空间之间的通信需要native层的方法来实现,方法叫copy_form_user()。进程A的内核空间和进程B的用户空间通过Linux的一个mmap方法来创建出一个共享的物理内存地址,然后进程A的用户空间和进程B的用户空间进行通信的话,就只需要进程A的用户空间往进程A的内核空间进行一次数据拷贝(copy_from_user),进程B的用户空间与进程A的内核空间通过mmap内存映射的方式,就能在共享的物理能存中获取到进程A拷贝的数据,就实现了通信。

11、Handler的机制

Handler机制之前有说过,这里不再重复了,但是要详细的了解内容还是非常多的,看到这里的话,几乎每个大厂都会问Handler机制,所以还是需要去多了解一些。

12、关于Handler有一个需求,消息队列里还有很多没有执行的消息,有一个消息要立刻执行,要怎么做?

答:这个问题当时真不知道怎么处理,其实是第13个问题的答案,Handler发送消息其实是同步执行的,发送的消息都在消息队列中进行排队的。要做到立刻执行,可以通过异步消息的方式,这里就需要了解同步屏障和异步消息机制了。直接到第13问吧

13、Handler同步屏障异步消息的概念的理解

答:同步屏障,让异步消息不用排队等候处理。可以理解为同步屏障是一堵墙,把同步消息队列拦住,先处理异步消息,等异步消息处理完了,这堵墙就会取消,然后继续处理同步消息。

   public void postSyncBarrier() {
       Method method = MessageQueue.class.getDeclaredMethod("postSyncBarrier");
       token = (int) method.invoke(Looper.getMainLooper().getQueue());
   }

   public void removeSyncBarrier() {
       Method method = MessageQueue.class.getDeclaredMethod("removeSyncBarrier", int.class);
       method.invoke(Looper.getMainLooper().getQueue(), token);
   }

发送异步消息比较简单,调用Message的setAsynchronous(boolean flag)方法即可,甚至可以直接创建一个异步Handler。

14、平时工作有处理过OOM的问题么?系统抛出OOM的原因有哪些?

答:OOM就是内存溢出,现在加载图片也都用Glide等图片加载库了,就比较少出现加载图片的OOM。OOM出现的原因归结到底其实就是因为程序进程需要申请一块内存,但是系统无法提供需要的内存大小,就会抛出OOM异常。内存泄漏是OOM的一个很大原因,还有就是图片,资源对象未关闭、注册的服务未及时反注册、图片太大等等造成OOM异常。

15、Android系统在内存不足时,依据什么来杀掉一些应用的?

答:通常在一部Android手机里同时运行着多个应用(app),每个app对应一个系统进程,当系统需要更多的资源(如内存)而空闲资源不足时,Android系统就会选择杀掉一些“低优先级”的进程以便释放所需资源。如果一个app正在与用户交互,那么它所在的进程具有最高优先级;其次,如果一个app是可见的,例如被一个对话框部分遮挡,它所在进程具有第二高的优先级;再次,如果app当前是不可见的,也就是被切换到了后台,则它所在进程具有第三高的优先级;这里要补充一点,如果这个后台app启动了一个service,则它比一般的后台app优先级高一些。最后,如果一个进程里没有包含任何app(空进程),这个进程的优先级是最低的。

上一篇下一篇

猜你喜欢

热点阅读