【Android】Handler用法及原理解析


Handler 是用于在不同线程之间进行消息传递的机制。它与 LooperMessageQueue一起工作,帮助在不同线程间传递和处理消息,特别是在主线程与子线程之间进行通信。

用处

  1. 子线程通过 Handler 更新 UI
  2. 用于线程间通信

基本用法

用法一:使用sendMessage和handleMessage方法

  1. 创建Handler:通常在主线程中创建一个Handler,用于处理从其他线程发送的消息。

    Handler handler = new Handler();
    
  2. 发送消息:在子线程中,通常使用handler.sendMessage()来向主线程发送消息。

    new Thread(new Runnable() {
         
        @Override
        public void run() {
         
            Message message = Message.obtain();
            message.what = 1;
            handler.sendMessage(message);
        }
    }).start();
    
  3. 处理消息:主线程中的Handler会调用handleMessage()方法来处理接收到的消息。

    Handler handler = new Handler(Looper.getMainLooper()) {
         
        @Override
        public void handleMessage(Message msg) {
         
            switch (msg.what) {
         
                case 1:
                    // 处理消息
                    break;
            }
        }
    };
    

用法二:使用post方法

  1. 创建 Handler

    Handler handler = new Handler(Looper.getMainLooper());
    
  2. 使用 post 方法:可以直接在 Handler 中执行需要在主线程上运行的代码块。

    handler.post(new Runnable() {
         
        @Override
        public void run() {
         
            // 执行主线程任务
        }
    });
    

    区别:

    sendMessage: 适用于更复杂的消息处理和任务调度,特别是需要在多个线程之间通信时。它依赖于 Handler 类,通过消息机制来传递和处理任务。

    post: 更加简洁和直接,主要用于在主线程中执行任务,尤其是需要更新 UI 的情况。适合用于在视图中直接执行代码而不涉及复杂的线程通信。

法一工作原理

主要依靠以下

  1. Looper:负责不断从 MessageQueue 中取出消息并分发给相应的 Handler 进行处理。

  2. HandlerHandler 是一个用于发送和处理消息的类。它可以用来将 MessageRunnable 对象发送到消息队列中,并在对应的线程中处理这些消息。

  3. Message:用于在 HandlerLooper 之间传递消息。

  4. MessageQueueMessageQueue 是消息的容器,负责存储和管理待处理的消息。维护了一个消息队列,按顺序处理消息。

举个例子:

天气预报:子线程获取到了天气数据,然后使用Message将数据包装,通过Handler对象的sendMessage方法将Message对象插入到消息队列(MessageQueue)中,主线程通过Looper.loop方法死循环检查MessageQueue中是否有消息,主线程的 Handler 会通过 handleMessage() 方法接收这个 Message

Handler的sendMessage

handler.sendMessage(message);

img

sendMessageDelayedsendEmptyMessageAtTimesendEmptyMessageDelayedsendEmptyMessage

这些Handler类中发送消息的方法最终调用的方法都是sendMessageAtTime

sendMessageAtTime方法中再调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值