Android handler:工作原理

本文深入解析了Android中的Handler机制,包括其定义、作用及为何需要该机制等内容,并通过实例介绍了Handler的工作原理及其与线程(Thread)、循环器(Looper)之间的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者:Carson_Ho
转载学习链接:https://www.jianshu.com/p/f0b23ee5a922

定义:

一套android消息传递机制

作用:

在多线程应用场景中,将工作线程需要更新UI的操作信息传递到UI主线程,从而实现工作线程对UI的更新处理,最终实现异步消息的处理
在这里插入图片描述
为什么需要Handler消息传递机制
多个线程更新UI的同事,保证线程安全
在这里插入图片描述

相关概念:

在这里插入图片描述

工作原理解析:
Handler机制的工作流程主要包括4个步骤:

  • 异步通信准备
  • 消息发送
  • 消息循环
  • 消息处理
    在这里插入图片描述

工作流程图:

在这里插入图片描述

线程(Thread)、循环器(Looper)、处理者(Handler)之间的对应关系如下:

1个线程(Thread)只能绑定 1个循环器(Looper),但可以有多个处理者(Handler)

1个循环器(Looper) 可绑定多个处理者(Handler)

1个处理者(Handler) 只能绑定1个1个循环器(Looper)

在这里插入图片描述

Thread跟Runnable对比

在这里插入图片描述

package com.example.carson_ho.demoforrunnable3;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
//主布局中定义了一个按钮用以启动线程
Button button;

//步骤1:创建线程类,实现Runnable接口
private class MyThread1 implements Runnable{

    private int ticket = 100;//两个窗口一共要卖100张票

    //在run方法里复写需要进行的操作:卖票速度1s/张
    @Override
    public void run(){
        while (ticket>0){
            ticket--;
            System.out.println(Thread.currentThread().getName() + "卖掉了1张票,剩余票数为:"+ticket);

            try {
                Thread.sleep(1000);//卖票速度是1s一张
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //Button按下时会开启一个新线程执行卖票
    button = (Button) findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            //步骤2:创建线程类的实例
            //因为是两个窗口共卖100张票,即共用资源
            //所以只实例化一个实现了Runnable接口的类
            MyThread1 mt = new MyThread1();

            //因为要创建二个线程,模拟二个窗口卖票
            Thread mt11 = new Thread(mt, "窗口1");
            Thread mt12 = new Thread(mt, "窗口2");

            //步骤3:调用start()方法开启线程
            //启动二个线程,也即是窗口,开始卖票
            mt11.start();
            mt12.start();

        }
    });
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值