android需要将耗时的操作放在子线程,否则ANR致使AP关闭;但若子线程涉及UI更新,而Android主线程是线程不安全的(线程安全是指:多线程访问加锁以提供数据保护),所以UI更新只能放在主线程执行。
每个Thread只对应一个looper,有ThreadLocal的限制;
Handler只对应一个looper,只对应一个消息队列
一般用于统一进程中不同线程消息队列,如下AudioService就可以通过mAudioHandler向AudioSystemThread发送消息
(比如adjustStreamVolume发送SET_DEVICE_VOLUME到AudioSystemThread Looper,接受后调setDeviceVolume到下层,这会是个耗时操作)
Thread that handles native AudioSystem control.
3710
3711 private class More ...AudioSystemThread extends Thread {
3712 More ...AudioSystemThread() {
3713 super("AudioService");
3714 }
3715
3716 @Override
3717 public void More ...run() {
3718 // Set this thread up so the handler will work on it
3719 Looper.prepare();
3720
3721 synchronized(AudioService.this) {
3722 mAudioHandler = new AudioHandler();
3723
3724 // Notify that the handler has been created
3725 AudioService.this.notify();
3726 }
3727
3728 // Listen for volume change requests that are set by VolumePanel
3729 Looper.loop();
3730 }
3731 }
可以帮我们学习到:
1. looper体现了责任链模式的实践
2. 在同一线程中,作用是分离发送者和接受者的耦合
3. 不同线程中多了异步消息处理机制的作用
4. message.obtain而不是new Message;使用消息池(享元模式)优化资源