文档章节

消息机制

 梦想家Peng
发布于 2016/03/03 11:53
字数 693
阅读 42
收藏 0

消息机制
----------------------------------
Handler:用于发送消息、处理消息
Message:用于承载消息的数据
MessageQueue:消息队列,是若干消息的容器
Looper:消息队列的轮循者


消息的分发与处理
----------------------------------
【处理消息的方式】
方式1. 自定义类继承Handler,并重写handleMessage()
方式2. 自定义类实现Handler.Callback,重写接口中的抽象方法,并在创建Handler对象时,使用该类的对象作为Handler的构造方法的参数
方式3. 使用Message.obtain()方法获取Message对象时,指定Runnable callback,并在callback中处理消息

        // handler = new Handler(new InnerHandlerCallback());

    }
    
//    private class InnerHandlerCallback implements Handler.Callback {
//
//        @Override
//        public boolean handleMessage(Message msg) {
//            Intent intent = new Intent(GuideActivity.this, MainActivity.class);
//            startActivity(intent);
//            finish();
//            return false;
//        }
//        
//    }

【分发和处理原则】
如果存在方式3,则直接按照方式3处理,并结束;
如果不存在方式3,且存在方式2,则优先按照方式2处理;
如果方式2的Callback中抽象方法返回值为true,则直接处理结束,否则,按照方式2处理完成后还会按照方式1处理。
以上部分参考android.os.Handler类的dispathMessage()方法。


关于创建子线程的Handler
----------------------------------
必须先调用Looper.prepare(),才可以在子线程中创建Handler对象。
必须调用Looper.loop()才可以让轮循者开始轮循消息队列,如果没有调用,则轮循者不会自动开始工作,也就意味着发出的消息不会被处理!
Ps:主线程默认就会准备Looper对象并开始轮循,所以在主线程中创建Handler时不需要显式的操作Looper。


关于Handler运行在哪个线程
----------------------------------
结论:当创建Handler时,关联到哪个线程的Looper,则Handler就在哪个线程上处理消息,如果没有显式的指定Looper,则以创建Handler时所在的线程为准。


HandlerThread类
----------------------------------
HandlerThread的本质是一个线程类,在这个线程中,会准备并启用在子线程的Looper,开发者可以调用HandlerThread的getLooper()方法获取到运行在子线程的Looper对象,并用于创建运行在子线程的Handler。
注意:在调用getLooper()方法之前,必须先启动HandlerThread线程,即调用HandlerThread的start()方法。
用途:基于消息队列的“队列”特性,可以使用运行在子线程的Handler发出多个消息,那么,Handler在子线程中处理时会依次处理,并且,可以处理耗时操作。简言之:依次处理多个耗时操作。

    HandlerThread ht = new HandlerThread("");
        ht.start();
        Looper subLooper = ht.getLooper();
        handler = new Handler(subLooper, new InnerHandlerCallback());
    }
    
    private int count = 1;
    
    public void sendMessage(View v) {
        Message.obtain(handler, 0, count, 0).sendToTarget();
        count++;
    }
    
    private class InnerHandlerCallback implements Handler.Callback {

        @Override
        public boolean handleMessage(Message msg) {
            for (int i = 0; i < 10; i++) {
                Log.d("tag", "handleMessage[" + msg.arg1 + "] ... ...");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return false;
        }
        
    }


© 著作权归作者所有

共有 人打赏支持
粉丝 0
博文 34
码字总数 15605
作品 0
深圳
Android Handler异步通信:深入详解Handler机制源码

前言 在开发的多线程应用场景中,机制十分常用 今天,我将手把手带你深入分析 机制的源码,希望你们会喜欢 目录 1. Handler 机制简介 在多线程的应用场景中,将工作线程中需更新的操作信息 ...

carson_ho
05/21
0
0
linux的分布式思想

上一篇《X window的思想和终端的重大意义》谈到unix的哲学影响,继承unix的linux在分布式方面表现的淋漓尽致,它首先采用了x window作为自己的图形界面机制,然后又用netlink套接字作为自己的...

晨曦之光
2012/04/10
305
0
【转载】关于RabbitMQ的消息确认

RabbitMQ 将消息投递到客户端后,客户端如果没处理完这个消息就死掉了,这个消息还会不会存在?这取决于 RabbitMQ 的消息确认机制(Message acknowledgment)是否打开。 为了确保消息不会丢失...

摩云飞
2012/11/27
0
0
# Handler在多线程间进行消息通信

Handler在多线程间进行消息通信 主要控件:Handler+Message+MessageQueue+LooperHandler机制及其相关用法: 在andriod世界里handler的作用主要用来处理线程间通信,即我们常说的消息机制,那...

Scus
2017/11/22
0
0
Android Handler消息传递机制:图文解析工作原理

前言 在开发的多线程应用场景中,机制十分常用 今天,我将图文详解 机制 的工作原理,希望你们会喜欢 目录 1. 定义 一套 消息传递机制 2. 作用 在多线程的应用场景中,将工作线程中需更新的操...

02/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

05-《深度拆解Java虚拟机》之JVM是如何执行方法调用的?(下)

一、问题引入 我们知道,设计模式大量使用了虚方法来实现多态。但是虚方法的性能效率并不高,所以作者就想在此基础上写篇文章,评估每一种设计模式因为虚方法调用而造成的性能开销,并且在文...

飞鱼说编程
12分钟前
0
0
nginx统一入口 多服务出口

nginx配置多ip和端口统一调用入口log_format中$upstream_addr 标识打印转发的url地址配置upstream和locationhttp {include mime.types;default_type application/octet-stream...

GoldenVein
14分钟前
0
0
阿里P9架构师谈:高并发网站的监控系统选型、比较、核心监控指标

在高并发分布式环境下,对于访问量大的业务、接口等,需要及时的监控网站的健康程度,防止网站出现访问缓慢,甚至在特殊情况出现应用服务器雪崩等场景,在高并发场景下网站无法正常访问的情况...

我是你大哥
16分钟前
0
0
华为HiAI 助力苏宁易购,让你尽享完美视觉购物体验!

还在感慨商品照片与实物存在差距,又要退货? 还在抱怨被忽视的图片小细节,影响了生活品质? 想要“买买买”, 又担心海量的商品图片耗光你的流量? 就在近期 搭载HiAI能力的苏宁易购新版上线...

华为终端开放实验室
17分钟前
0
0
聊聊redisson的RMap的computeIfAbsent操作

序 本文主要研究一下redisson的RMap的computeIfAbsent操作 实例 @Test public void testRMapComputeIfAbsent(){ Config config = new Config(); config.useSingleS......

go4it
30分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部