Android 面试常见知识点

1.Android 多进程通信
参考链接:https://www.jianshu.com/p/ce1e35c84134
NO1. 定义:
如果一个进程占用内存超过了这个内存限制,就会报OOM的问题,很多涉及到大图片的频繁操作或者需要读取一大段数据在内存中使用时,很容易报OOM的问题。为了彻底地解决应用内存的问题,Android引入了多进程的概念,它允许在同一个应用内,为了分担主进程的压力,将占用内存的某些页面单独开一个进程,比如Flash、视频播放页面,频繁绘制的页面等。

NO2. 多进程间的通信IPC
IPC:InterProcess Communication,即进程间通信。
我们知道,同一个进程的多个线程是共享该进程的所有资源,但多个进程间内存是不可见的,也就是说多个进程间内存是不共享的。那么进程间是如何进行通信的呢?

Android中提供了三种方法:
1.系统实现。
2.AIDL(Android Interface Definition Language,Android接口定义语言):大部分应用程序不应该使用
AIDL去创建一个绑定服务,因为它需要多线程能力,并可能导致一个更复杂的实现。
3.Messenger:利用Handler实现。(适用于多进程、单线程,不需要考虑线程安全),其底层基于AIDL。

2.Android 内存泄露,举例几个容易发生内存泄露的场景
参考链接:https://blog.csdn.net/jkerving/article/details/52246851
一.什么是内存泄漏

在Java程序中,如果一个对象没有利用价值了,正常情况下gc是会对其进行回收的,但是此时仍然有其他引用指向这个活在堆内存中的对象,那么gc就不会认为这个对象是一个垃圾,那么就不会对其进行回收,所以它会一直活在堆内存中占用内存,这就导致了内存泄漏。

总结一下,导致内存泄漏的原因就是有一些我们永远不会使用的对象,仍然有引用指向它(当然这是在强引用的情况下),那么就不满足gc回收的条件,从而一直活在堆内存中导致内存泄漏,这样的对象多了占用大量内存就会导致App发生oom。

举几个例子:比如1.使用EventBus,肯定是要执行register(),那么在Fragment或Activity finish的时候,一定不要忘记执行unregister()方法。 2.又或者是myHandler.postDelayed()延时操作,延时操作还在进行对外部变量还有引用,Antivity finish的时候,这个引用不会释放,不会被gc回收。3.BroadCastReceiver、Service 解绑 。4.handler 清理。5.Cursor及时关闭 。6.I/O流 7.线程不再需要继续执行的时候要记得及时关闭,开启线程数量不易过多,一般和自己机器内核数一样最好,推荐开启线程的时候,使用线程池。线程生命周期要跟activity同步。

3.Retrofit 的源码和原理(Retrofit框架的原理)
参考链接:https://blog.csdn.net/guiman/article/details/51480497
1 . 什么是Retrofit?
Retrofit是针对于Android/Java的、基于okHttp的、一种轻量级且安全的、并使用注解方式的网络请求框架。

2 . 我们为什么要使用Retrofit,它有哪些优势?
首先,Retrofit使用注解方式,大大简化了我们的URL拼写形式,而且注解含义一目了然,简单易懂;
其次,Retrofit使用简单,结构层次分明,每一步都能清晰的表达出之所以要使用的寓意;
再者,Retrofit支持同步和异步执行,使得请求变得异常简单,只要调用enqueue/execute即可完成;
最后,Retrofit更大自由度的支持我们自定义的业务逻辑,如自定义Converters。

4.Dagger2 框架中 @module 和 @component 的区别

5.Kotlin 特性,和 Java 相比有什么不同的地方

6.MVP 架构中 Presenter 定义为接口有什么好处

7.Fragment 在 ViewPager 里面的生命周期,滑动 ViewPager 的页面时 Fragment 的生命周期的变化,懒加载生命周期

8.热修复的原理

9.RecyclerView 和 ListView 的相同和不同点,在 item 回收上有什么不同

10.View 事件分发机制
Android事件分发机制的本质:事件从哪个对象发出,经过哪些对象,最终由哪个对象处理了该事件。此处对象指的是Activity、Window与View。

Android事件的分发顺序:Activity(Window) -> ViewGroup -> View

Android事件的分发主要由三个方法来完成,如下所示:

// 父View调用dispatchTouchEvent()开始分发事件
public boolean dispatchTouchEvent(MotionEvent event){
boolean consume = false;
// 父View决定是否拦截事件
if(onInterceptTouchEvent(event)){
// 父View调用onTouchEvent(event)消费事件,如果该方法返回true,表示
// 该View消费了该事件,后续该事件序列的事件(Down、Move、Up)将不会在传递
// 该其他View。
consume = onTouchEvent(event);
}else{
// 调用子View的dispatchTouchEvent(event)方法继续分发事件
consume = child.dispatchTouchEvent(event);
}
return consume;
}

11.描述一下View的绘制原理?

View的绘制流程主要分为三步:

onMeasure:测量视图的大小,从顶层父View到子View递归调用measure()方法,measure()调用onMeasure()方法,onMeasure()方法完成绘制工作。
onLayout:确定视图的位置,从顶层父View到子View递归调用layout()方法,父View将上一步measure()方法得到的子View的布局大小和布局参数,将子View放在合适的位置上。
onDraw:绘制最终的视图,首先ViewRoot创建一个Canvas对象,然后调用onDraw()方法进行绘制。onDraw()方法的绘制流程为:① 绘制视图背景。② 绘制画布的图层。 ③ 绘制View内容。 ④ 绘制子视图,如果有的话。⑤ 还原图层。⑥ 绘制滚动条。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值