问题:
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消息机制常见问题
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 一、提出问题 面试时常被问到的问题: 简述 Android 消息机制 Android 中 Handler,Loop...
- 【Android Handler 消息机制】 前言 在Android开发中,我们都知道不能在主线程中执行耗时的任务...