文档章节

消息机制

 梦想家Peng
发布于 2016/03/03 11:53
字数 693
阅读 43
收藏 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
深圳
私信 提问
【转载】关于RabbitMQ的消息确认

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

摩云飞
2012/11/27
0
0
Android Handler异步通信:深入详解Handler机制源码

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

carson_ho
2018/05/21
0
0
Android Handler消息传递机制:图文解析工作原理

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

2018/02/12
0
0
同步/异步与阻塞/非阻塞的区别

我喜欢用自己的语言通过联系现实生活中的一些现象解释一些概念,当我能做到这一点时,说明我已经理解了这个概念.今天要解释的概念是:同步/异步与阻塞/非阻塞的区别. 这两组概念常常让人迷惑,因...

地狱的烈火
2013/02/22
0
0
linux的分布式思想

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

晨曦之光
2012/04/10
319
0

没有更多内容

加载失败,请刷新页面

加载更多

Intellij IDEA中设置了jsp页面,但是在访问页面时却提示404

在Intellij IDEA中设置了spring boot的jsp页面,但是在访问时,却出现404,Not Found,经过查找资料后解决,步骤如下: 在Run/Debug Configurations面板中设置该程序的Working Directory选项...

uknow8692
昨天
1
0
day24:文档第五行增内容|每月1号压缩/etc/目录|过滤文本重复次数多的10个单词|人员分组|

1、在文本文档1.txt里第五行下面增加如下内容;两个方法; # This is a test file.# Test insert line into this file. 分析:给文档后增加内容,可以用sed 来搞定;也可以用while do done...

芬野de博客
昨天
1
0
深入理解JVM—JVM内存模型

深入理解JVM—JVM内存模型 我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU的交互,而CPU运转速度越来越快,磁盘远远跟不上CPU的读写速度,才设计了内存...

onedotdot
昨天
1
0
MVC、MVCS、MVVM、MVP、VIPER等这么多架构模式哪一个好呢?

在项目开启阶段,其中一个很重要的环节就是选架构。 那么面对目前已知的这么多架构模式我们该怎么选择呢?这确实是个很让人头疼的问题! 下面我就在这里梳理一下目前常见的一些架构模式。 先...

Java干货分享
昨天
8
0
简单模仿配置文件的反射机制

//Student类 public class Student { public void love() { System.out.println("python"); } } //Tesy类 public class Tesy { public static void main(String[] args) throws Exceptio......

南桥北木
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部