Looper与Handler

android需要将耗时的操作放在子线程,否则ANR致使AP关闭;但若子线程涉及UI更新,而Android主线程是线程不安全的(线程安全是指:多线程访问加锁以提供数据保护),所以UI更新只能放在主线程执行。

http://gityuan.com/2015/12/26/handler-message-framework/

每个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;使用消息池(享元模式)优化资源

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值