由于日常工作不需要经常写android上层应用,对Android的Handler机制一直处于模模糊糊的状态。使用Handler之后,回去写c++代码时,时刻怀念Android里面的Handler,希望有一个c++版本的Handler。为了能自己实现c++版本的Handler,今天准备去梳理一下这Android中的Handler。
由于在手机上看代码格式很乱,建议用电脑查看。
理解Android中的Handler
Handler的适用场景
只要写多线程程序,必不可少要碰到线程通信的问题。其中一个办法就是在工作线程中开辟一个消息队列,别的线程往消息队列发消息,即可完成与本线程的通信。工作线程顺序的从消息队列中读取消息并逐一处理。这种模型的好处是:
- 消息可以缓存
- 工作线程中消息是顺序处理的,所以不需要加锁。
Handler适用的就是这种场景:多个线程往一个工作线程发消息,工作线程顺序挨个处理。
Android中的Handler
google设计Handler最初的原因:
在安卓应用中,多个线程去处理UI的刷新,而UI操作不是线程安全的,如果要实现多线程对UI的操作,就需要在每一个要进行UI操作的地方进行加锁。
加锁操作引入的问题:
- 锁的管理复杂,开发者容易忘记加锁,解锁,或者乱加锁造成死锁
- 加锁是有性能消耗的
- Android选用java作为开发语言就是看中其开发效率,引入锁加大开发难度了!
因此UI操作就该由一个单一线程进行处理,在Android中,UI线程就是应用进程的第一个线程--主线程。所以每一个android应用的开发者都会被告诫:不要在主线程里搞事情阻塞UI处理。
为了简化操作,google设计了Handler机制,开发者只需要创建一个Handler,然后在别的线程利用主线程的handler发送消息即可完成与主线程的通信。
Handler, Looper, Thread ,Message之间的关系
- Looper: 用来管理消息队列的,它提供一个loop()接口,不停的从消息队列中取消息来处理。
- Thread: 是Looper运行的载体,一个Thread有且只有一个Looper。
- Handler: 是用来往运行与Thread里的Looper的消息队列发消息用的