handler对象所绑定的线程并不取决于该handler对象由哪个线程构建,而是取决于该handler对象所绑定的Looper属于哪个线程。
Looper就像一个消息队列(MessageQueue)的管家,一个消息队列只有一个管家,并且管理者整个消息队列,而一个消息队列内可以容纳多个消息(Message),而工人(Handler)也可以有多个,管家派遣他们向消息队列中存储或取出消息后执行任务;
所以它们的个数如下:
管家(Looper): 1 个;
消息队列(MessageQueue):1 个;
消息(Message):可以多个;
工人(Handler):可以多个;
在非UI线程使用Handler进行线程通信时,一般都需要进行3个步骤:
- 创建Looper Looper.prepare() (创建了一个Looper和MessageQueue)
- 创建Handler Handler
- 启动消息循环 Looper.loop()
如果你不带参数实例化:Handler handler=new Handler();那么这个会默认绑定当前线程的Looper。
一般而言