美文网首页
Handler消息机制常见问题

Handler消息机制常见问题

作者: 夜光草 | 来源:发表于2023-04-04 22:03 被阅读0次

问题:
1.一个线程有几个Handler?一个线程有几个Looper?如何保证?
一个线程可以有N多个Handler,但是一个线程只有一个Looper,通过ThreadLocal保证
2.线程间通信的原理是怎么样的?
子线程发送Message到MessageQueue
主线程从MessageQueue中取出消息,并处理消息
线程间内存共享,MessageQueue共享
3.Handler内存泄漏原因?为什么其他的内部类没有说过有这个问题?
sMainLooper->Looper->MessageQueue->Message->Handler->Activity
引用关系,因为sMainLooper是一个静态变量,可以作为GcRoots,导致Activity的资源不能被释放。解决方法:将Handler改成static,使用弱引用持有Activity的引用,并且在Acitivity销毁时移除掉Message。
4.为何主线程可以new Handler?如果想要在子线程中new Handler要做哪些工作?
主线程在ActivityThread的main()方法中已经创建了Looper,当在主线程new Handler时,通过ThreadLocal可以获取到当前主线程的Looper。在子线程new Handler时,在之前要调用Looper.prepare()方法创建Looper对象,在之后调用Looper.loop()方法。
系统提供了HandlerThread,使用sychronized、wait、notifyAll解决了并发问题。
5.子线程中维护的Looper,消息队列无消息的时候的处理方案是什么?有什么用?
在Handler机制里面有一个Looper,在Looper机制里面有两个函数,叫做quitSafely()和quit()函数,这两个函数是调用的MessageQueue的quit()。
6.既然可以存在多个Handler往MessageQueue中添加数据(发消息时各个Handler可能处于不同线程),那它内部是如何保证线程安全的?
在MessageQueue的enqueueMessage方法中添加了sychronized锁
7.我们使用Message时应该如何创建它?
调用Message.obtain(),通过对象池获取Message,对象池的大小为50。
使用到享元设计模式
8.Looper死循环为什么不会导致应用卡死?
消息队列里面没有消息时,会休眠 nativePollOnce

相关文章

网友评论

      本文标题:Handler消息机制常见问题

      本文链接:https://www.haomeiwen.com/subject/mmfsddtx.html