Handler面试题

Handler面试题

1、子线程到主线程通信都有哪些方式?子线程到主线程通信的原理
handler
内存:线程间共享

Handler面试题_第1张图片

主线程:处理消息
Handler.handlerMessage()
Looper.loop()死循环取消息 -> queue.next ->handler.dispatchMessage()->handler.handlerMessage

子线程:发送命令
子线程如何发送消息
Handler.sendMseeage()/sendEmptyMessage/post() -> queue.enqueueMessage
queue是一个队列 (先进先出),按照时间排序 消息入队列

内存隔离:linux内核,IPC,binder机制

2、主线程可以创建多少个Handler?子线程可以handler有什么条件
Handler对象可以创建N个,但是Looper就一个
new Handler() 内部后通过Looper.myLooper()获取当前线程

Handler面试题_第2张图片Handler面试题_第3张图片

子线程如何创建Handler?
new Handler(ChilderThread.Looper())
Handler面试题_第4张图片

Looper.loop()代码不会生效,因为Looper.loop()是一个死循环,
如何执行子线程中的代码,通过threadHandler.sendMessage发消息到handler中执行

子线程能否创建多个Handler?可以,使用HandlerThread
异步问题,run方法中可能没有执行完初始化,主线程中就获取子线程looper,导致获取为空

使用synchronize和wait同步初始化状态

Handler面试题_第5张图片

synchronized:内置锁

Handler面试题_第6张图片

wait / sleep有什么区别
wait :当前线程等待,会交出当前锁,cpu继续执行其他任务
sleep: cpu等待,停止所有线程
Handler面试题_第7张图片

notifyAll和notify有什么区别
可能会有多个线程同时 获取锁,释放所有

notifyAll放在Looper.myLooper()上面和下面没有区别
notify会等待锁中所有代码执行完才释放锁,notify只是通知wait处于就绪态,不是处于立即执行状态

3、MessageQueue中存储的Message数量有上限吗?为什么这么设计?能不能用阻塞队列做MEssageQueue
a、messageQueue中存储的Message没有上限。
b、由于主线程所有东西,包括生命周期,fragment,view都是Message,1s大概250个message所以不能设置上限
c、不能用阻塞队列做MessageQueue

Looper运行机制:生产者消费者运行机制

UI:60hz的屏幕,每16.7ms刷新一次,一次刷新发送3个message,相当于1s发送180个Message
主线程1s大概发送250个Message,主线程所有东西,包括生命周期,fragment,view都是Message

如何做卡顿监控?使用BlockCanary,记录message起始时间点,结束时间点,及线程信息,
Looper中提供loggin方法,实例化loggin,就能在loop中自动打印message信息

Handler面试题_第8张图片

阻塞队列有大小限制

android中运用阻塞队列:线程池->okhttp

4、IdleHandler你了解吗?做什么用的

IdleHandler:当主线程空闲情况下执行的消息

Message消息分为3类:
a、一般消息 平时写的Message
b、紧急需要执行的消息 UI刷新消息,ui刷新会有消息屏障
c、空闲时间执行的消息 onStop后执行的Message

消息屏障

主线程空闲:什么情况下会用
activityA->activityB
A onPause -> B launch onCreate onStart onResume -> A onStop

BActivity 显示后A切到后台后

GC、启动速度优化,使用IdleHandler,一些不着急加载使用IdleHandler去启动加载

5、我们使用Message时应该如何创建它
message的创建、使用、销毁
频繁的创建及GC会导致内存泄漏
JVM:线程停止,导致卡顿
Handler面试题_第9张图片

消息池,50条缓存Message,使用完成后重新清除内容回收重新放入队列
享元设计模式

6、handler没有消息处理是阻塞还是非阻塞的?为什么不会有anr产生
没有消息的时候是睡眠状态,不只是阻塞状态、超过5s不会产生anr
anr: application not response 事务没有在规定完成任务产生的 机制不一样

Handler面试题_第10张图片

你可能感兴趣的:(java,开发语言)