美文网首页
Handler消息机制

Handler消息机制

作者: 啤酒小龙虾 | 来源:发表于2018-03-27 17:09 被阅读0次

Android规定只允许UI线程修改Activity里面的UI组件,如果我们要在子线程中去执行更改UI的操作,会导致UI操作的线程不安全,就会报错。所以我们就要用到Hanlder消息机制

消息机制的使用:

private Handler mHandler = new Handler(){

    @Override

    public void handleMessage(Message msg) {

        switch (msg.what){

            case 100:

            Toast.makeText(MainActivity.this,"",Toast.LENGTH_SHORT).show();

            break;

           }

    }

};

然后在需要进行进行弹 Toast的地方发送消息 调用如下方法:

mHandler.sendEmptyMessageDelayed(100,200);

Handler机制的相关概念

Message(消息)

    定义:Handler接收和处理的消息对象(Bean对象)

    作用:通信时相关信息的存放和传递

ThreadLocal 

    定义:线程内部的数据存储类

    作用:负责存储和获取本线程的Looper

MessageQueue(消息队列) 

    定义:采用单链表的数据结构来存储消息列表

    作用:用来存放通过Handler发过来的Message,按照先进先出执行

Handler(处理者) 

    定义:Message的主要处理者

    作用:负责发送Message到消息队列和处理Looper分派过来的Message

Looper(循环器) 

    定义:扮演MessageQueue和Handler之间桥梁的角色

    作用:  消息循环:循环取出MessageQueue的Message 

                消息派发:将取出的Message交付给相应的Handler

他们之间的关系:

Looper中存放有MessageQueue,MessageQueue中又有很多Message,当我们的Handler发送消息时,会获取当前的Lopper,并将消息存放到当前Lopper的MessageQueue中。而MessageQueen也会在Looper的带动下,(Looper.loop()方法)一直循环的读取Message信息,并将Message信息发送给Handler,并执行HandlerMessage()方法

注意:Looper存在在主线程,而且只有唯一的一个   MessageQueue也是只有一个存在在主线程  通过查看源码可以知道  在创建Looper的实例的时候,会自动创建一个与之配对的MessageQueue

looper的退出方式

1、quit():quit会直接退出Looper

2、quitSafety():quitSafety只是设定一个退出标记,然后把消息队列中的已有消息处理完毕后退出Looper

Handler发送消息:

1、sendMessage(Message  msg);

2、post(Runnable  r);

Handler处理消息:

post()方法的处理方法就是将传进来的Runnable执行run()方法

sendMessage()方法的处理方法就是执行handleMessage()空方法,这也是我们为什么要在Handler重写这个方法的原因

相关文章

网友评论

      本文标题:Handler消息机制

      本文链接:https://www.haomeiwen.com/subject/awkscftx.html