文档章节

消息机制

 梦想家Peng
发布于 2016/03/03 11:53
字数 693
阅读 42
收藏 0
点赞 1
评论 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
【转载】关于RabbitMQ的消息确认

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

摩云飞
2012/11/27
0
0
linux的分布式思想

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

晨曦之光
2012/04/10
305
0
# Handler在多线程间进行消息通信

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

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

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

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

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

地狱的烈火
2013/02/22
0
0
iOS 消息的传递机制

转载原地址:http://beyondvincent.com/blog/2013/12/14/124-communication-patterns/ 注1:本文由破船译自Communication Patterns。 本文目录如下所示: 可用的机制 做出正确的选择 Framew...

孙启超
2013/12/18
1K
2
Android开发之道(10)Handler本质简析与使用实例

Android 开发之道(10)Handler本质简析与使用实例 作者:柳大·Poechant 邮箱:zhongchao.ustc@gmail.com 博客:blog.csnd.net/poechang 日期:March 19th, 2012 1 Overview 先浅析本质太过...

晨曦之光
2012/04/24
67
0
RabbitMQ消息队列(九):Publisher的消息确认机制

在前面的文章中提到了queue和consumer之间的消息确认机制:通过设置ack。那么Publisher能不到知道他post的Message有没有到达queue,甚至更近一步,是否被某个Consumer处理呢?毕竟对于一些非...

anzhsoft2008
2014/03/20
0
0
Objective-C消息转发机制

前言:最近一直在研读《Effective Objective-C 2.0》这篇文章,觉得受益匪浅。自己将书上的代码进行实现,再结合作者的解释进行思路扩展之后,对oc语言机制有了更深的理解; 这篇文章结合了自...

Samson_Xu
2017/08/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

python3.6用的外库遇到的问题

要用到wmi库 pip install wmi 装后不能用还要安装pywin32库。 要用到crypto加密模块安装pip instal pycrypto装后不能用。要安装pycryptodome。...

oisan_
10分钟前
0
0
select, poll, epoll I/O复用介绍

什么是I/O复用? 内核监视多个文件描述符(I/O文件句柄),一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知应用程序进行相应的读写操作。 I/O多路复用又被称为“事件驱动”(比如读写事...

xiaoxlm
10分钟前
0
0
【Spring 系列 给IOC容器添加组件的几种方式总结】

给Spring 注册Bean的几种方式总结。其中使用@Import注解是Spring Boot 完成自动配置的一个核心注解。 1、Spring 中给IOC容器添加组件的几种方式 在Spring的配置文件中,配置Bean(基于XML方式...

HansonReal
11分钟前
3
0
bootstrapTable语言包设置

###方法一引入不同的语言包 <script src="bootstrap-table-zh-CN.js"></script> ###方法二引入全语言包 <script src="bootstrap-table-locale-all.min.js"></script>//然后在初始化前设计默......

momo1987
12分钟前
0
0
Saltstack 常用命令

1、拷贝文件到客户端 # salt 'slaver.test.com' cp.get_file salt://apache.sls /tmp/cp.txt 2、拷贝目录到客户端 # salt 'slaver.test.com' cp.get_dir salt://test /tmp 3、显示存活的客户......

硅谷课堂
13分钟前
0
0
致初学者-如何学好Python这门编程语言?[图]

致初学者-如何学好Python这门编程语言?[图]: 对于很多Python3初学者,往往会面临以下问题:Python2和Python3我该学习哪一个?是否要安装Linux系统学习Python?Python3有各种版本我该安装哪...

原创小博客
15分钟前
1
0
E31---setopt=protected_multilib=false

今天在云服务器上装nginx,需要先安装一些依赖库比如zlib, ,但是安装zlib时候报错。 yum install -y zlib zlib-devel 1 (-y 指的是如果需要选yes no的自动y)下面是报错 Protected multil...

侠客行之石头
20分钟前
0
0
HTTP常见面试题

Http与Https的区别: HTTP 的URL 以http:// 开头,而HTTPS 的URL 以https:// 开头 HTTP 是不安全的,而 HTTPS 是安全的 HTTP 标准端口是80 ,而 HTTPS 的标准端口是443 在OSI 网络模型中,H...

JK_OPERA
21分钟前
0
0
python爬取站长素材网页图片保存到ppt中

网站地址:http://sc.chinaz.com/tupian/index.html 直接上代码: import requestsfrom bs4 import BeautifulSoupfrom pptx import Presentationfrom pptx.util import Inchesimpor......

你为什么不吃药
23分钟前
1
0
Ubuntu 18.04 swap空间的修改

一、准备工作 执行“sudo swapon -s”命令,查看是否已经存在swap file 二、修改swap file # 如果第一步存在swapfile则需要先禁用sudo swapoff /swapfile# 修改swap 空间的大小为2Gs...

Iceberg_XTY
26分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部