全面讲解 Handler机制原理解析 (小白必看)

简介

Handler是Android中提供的一种异步回调机制,也可以理解为线程间的消息通信。
为了避免ANR,我们通常会把一些耗时操作(比如:网络请求、I/O操作、复杂计算等)放到子线程中去执行,而当子线程需要修改UI时则子线程需要通知主线程去完成修改UI的操作,则此时就需要我们使用Handler机制来完成子线程与主线程之间的通信。

一、下面列出Handler相关的重要的类

  • Handler:处理者,负责Message的发送及处理。使用Handler时,需要实现handleMessage(Message msg)方法来对特定的Message进行处理,例如更新UI等。

  • Message:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队,终由Handler处理。

  • MessageQueue:消息队列,用来存放Handler发送过来的消息,并按照FIFO规则执行。当然,存放Message并非实际意义的保存,而是将Message以链表的方式串联起来的,等待Looper的抽取。

  • Looper:消息泵,不断地从MessageQueue中抽取Message执行。因此,一个MessageQueue需要一个Looper。

二、 下面画图分析

在这里插入图片描述

  • 理解图
    在这里插入图片描述
三、整个流程如下:
  • 1、以Handler的sendMessage方法为例,当发送一个消息后,会将此消息加入消息队列MessageQueue中。
  • 2、Looper负责去遍历消息队列并且将队列中的消息分发给对应的Handler进行处理。
  • 3、在Handler的handleMessage方法中处理该消息,这就完成了一个消息的发送和处理过程。
四、Handler 的基本使用

Message

  • message.what: 用户定义的消息代码,以便收件人可以识别
  • message.arg1 定义传递的int 类型的值1
  • message.arg2 定义传递的int 类型的值2
  • message.obj 定义传递的值由于类型是object(对象) 所以比较常用,可以传递各种值
  • handler.obtainMessage() 带参数形式发送消息,主要的却别代价可以通过下面的demo 区分,
  • message.setData() 使用bundle 的实行传参
下面是传参数为例子:

public class MainActivity extends AppCompatActivity {
    //创建一个Handler
    @SuppressLint("HandlerLeak")
    private Handler mhandler=new Handler(){
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            //对接收的message进行处理
            switch (msg.what) {
                case 1:
                    Bundle data = msg.getData();
                    Log.e("TAG", "测试接收数据---" + data.get("姓名"));
                    break;
            }
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = findViewById(R.id.button);
        //点击事件的处理
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Message message=new Message();
                message.what=1;
                Bundle bundle=new Bundle();
                bundle.putString("姓名","张三");
                message.setData(bundle);
                mhandler.sendMessage(message);
//                mhandler.sendEmptyMessage(1);
//sendEmptyMessage((what值)) 发送空的信息,只通知,不传任何参数
            }
        });
    }
}
  • 点击后控制台会打印如下:
    在这里插入图片描述
例二:用handler获取系统实时的时间

点击参考获取实时的时间

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AaVictory.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值