文档章节

关于Message

 梦想家Peng
发布于 2016/03/03 11:06
字数 632
阅读 22
收藏 0
点赞 1
评论 0

Android UI线程模型
-----------------------------------
UI:User Interface
UI线程:在Android中,主线程的任务是加载布局、初始化控件、配置控件的各项属性及监听器、响应事件,这些任务都是与UI控件相关的,所以,Android中的主线程也称之为UI线程。
主线程的使用原则是:只处理和UI相关的业务,完成必要的初始化,其它任务尽量通过子线程来完成,避免导致ANR。
为了保证主线程的UI控件正确更新、显示等,在Android中不允许子线程更新UI控件(严格的说:只允许创建UI的线程更新UI)。


Android中的线程通信模型
-----------------------------------
因为主线程可以更新UI,但不能执行耗时操作,而子线程可以执行耗时操作,却不可以更新UI,所以,需要线程之间实现相互通信。
在Android中,线程间通信使用“消息机制”来实现。表现为:在子线程中,使用Handler的类发出消息,在主线程中,使用Handler更新UI。


关于Message
-----------------------------------
Message是“消息机制”中“消息”的载体。
Message的常用属性有:
int what:表示消息的类型标识,可以由开发者随意指定,通常应该使用静态常量,而且,各消息的int值应该不相同
int arg1:表示在消息中需要封装的int类型数据,该属性的值应该是有数值含义的
int arg2:参考arg1
Object obj:作用参考arg1
创建Message对象:
尽管Message类提供了无参数的公有的构造方法,但是,并不推荐使用new Message()这样的语法创建对象,而应该使用Message.obtain()系列方法获取对象,因为Message类的内部实现了对消息对象的创建、管理等系统功能。
如果使用Message的obtain()系列方法时,在obtain()方法中指定了Handler对象,则最后应该使用Message对象的sendToTarget()方法执行消息的发送。

        pbProgress = (ProgressBar) findViewById(R.id.pb_progress);
        
        handler = new InnerHandler();
    }
    
    private class UpdateProgressThread extends Thread {
        @Override
        public void run() {
            for (int i = 0; i < 100; i++) {
//                Message msg = Message.obtain(handler);
//                msg.what = MESSAGE_UPDATE_PROGRESS;
//                msg.arg1 = i + 1;
//                msg.sendToTarget();
                
                // 参数1:消息的发送者与处理者(handler)
                // 参数2:消息的标识(what)
                // 参数3:消息中的数据(arg1)
                // 参数4:消息中的数据(arg2,本例中没有使用到)
                Message.obtain(handler, MESSAGE_UPDATE_PROGRESS, i+1, 0).sendToTarget();
                
                // handler.sendMessage(msg);
                // handler.sendEmptyMessage(MESSAGE_UPDATE_PROGRESS);
                
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    private class InnerHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
            if(MESSAGE_UPDATE_PROGRESS == msg.what) {
                pbProgress.setProgress(msg.arg1);
            }
        }
    }


© 著作权归作者所有

共有 人打赏支持
粉丝 0
博文 33
码字总数 15605
作品 0
深圳
JavaScript异步编程大冒险: Async/Await

Async/Await 是什么?Async/Await 也就是大家知道的异步函数,它是一个用来控制 JavaScript 异步流程的一个记号。而在很多现代浏览器上也曾实现过这样的设想。它的灵感来源于C# 和 F#,现在 ...

沉迷学习中 ⋅ 2017/12/21 ⋅ 0

基于 Giiwa 框架的 Message 模块--Giiwa-Message

基于 giiwa 框架的 Message 模块 关于giiwa, 请参阅 http://giiwa.org 内部消息系统模块,提供的后台管理,并向其他模块提供Message API和widget。 功能介绍 收件箱widget页面 消息提醒wid...

joe-j ⋅ 2016/09/29 ⋅ 0

关于Jackson注解无效

@Entity @Table(name="sendjsonmessage") @JsonPropertyOrder({"touser","msgType"}) public class JSONMessage implements Serializable { /** * */ private static final long serialVersi......

feihui ⋅ 2014/11/06 ⋅ 1

关于Shiro和groovy的问题

您好,看过您写的以及转发的关于Shiro的文章,最近在web项目中用到Shiro做用户安全,想请教您几个问题,我先把问题列出来,您有时间的时候希望指点下。 1.您转载的http://www.oschina.net/qu...

kryptolith ⋅ 2011/07/07 ⋅ 1

使用java.util.ResourceBundle国际化

如果简单使用信息文件message.properties,可以使用java.util.Properties直接load文件即可获取键值对。 但是如果考虑到国际化,需要将message.properties的内容写成不同语言的文字,也许可以...

hulubo ⋅ 2012/04/08 ⋅ 0

怎么写一个好的 Git commit message

网络上很多关于 commit message 的想法都来源于 tpope,在他看来,一个好的 Git commit messge 应该是这样的: Capitalized, short (50 chars or less) summary More detailed explanatory ...

liuchengxu ⋅ 2017/10/10 ⋅ 0

websocket sockJs 重连机制

大神么,有没有人有websocket+sockJs关于重连的代码,现在我这边通过sockjs连接websocket后接收到数据了,但是过一会后很快就自动连接关闭了,按理应该是长连接才对,但是总是会断开,有没有...

594zzb ⋅ 2017/05/18 ⋅ 0

对Android Handler Message Looper常见用法,知识点的一些总结

Android 非UI线程中是不能更新UI的,Handler是Android 提供的一套更新UI的机制,也是用来发送消息和处理消息的一套机制。 以前刚接触的Handler的时候,感觉总是很困惑,对Handler原理也是一知...

猴亮屏 ⋅ 06/11 ⋅ 0

nodejs认证模块passport.js参数解释

基本用法可参考以下文章: passport.js学习笔记 http://idlelife.org/archives/808 Express结合Passport实现登陆认证 http://blog.fens.me/nodejs-express-passport/ 官方文档 http://passp......

xshanj2 ⋅ 2015/12/27 ⋅ 0

PHP下操作Linux消息队列完成进程间通信的方法

来源:http://www.jb51.net/article/24353.htm 关于Linux系统进程通信的概念及实现可查看:http://www.ibm.com/developerworks/cn/linux/l-ipc/   关于Linux系统消息队列的概念及实现可查看...

botkenni ⋅ 2016/09/29 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

OSChina 周三乱弹 —— 这样的女人私生活太混乱了

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ 胖达panda :你经历过体验到人生的大起大落吗?我一朋友在10秒内体验了,哈哈。@小小编辑 请点一首《almost lover》送给他。 《almost love...

小小编辑 ⋅ 39分钟前 ⋅ 7

自己动手写一个单链表

文章有不当之处,欢迎指正,如果喜欢微信阅读,你也可以关注我的微信公众号:好好学java,获取优质学习资源。 一、概述 单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对...

公众号_好好学java ⋅ 44分钟前 ⋅ 0

Centos7重置Mysql 8.0.1 root 密码

问题产生背景: 安装完 最新版的 mysql8.0.1后忘记了密码,向重置root密码;找了网上好多资料都不尽相同,根据自己的问题总结如下: 第一步:修改配置文件免密码登录mysql vim /etc/my.cnf 1...

豆花饭烧土豆 ⋅ 今天 ⋅ 0

熊掌号收录比例对于网站原创数据排名的影响[图]

从去年下半年开始,我在写博客了,因为我觉得业余写写博客也还是很不错的,但是从2017年下半年开始,百度已经推出了原创保护功能和熊掌号平台,为此,我也提交了不少以前的老数据,而这些历史...

原创小博客 ⋅ 今天 ⋅ 0

LVM讲解、磁盘故障小案例

LVM LVM就是动态卷管理,可以将多个硬盘和硬盘分区做成一个逻辑卷,并把这个逻辑卷作为一个整体来统一管理,动态对分区进行扩缩空间大小,安全快捷方便管理。 1.新建分区,更改类型为8e 即L...

蛋黄Yolks ⋅ 今天 ⋅ 0

Hadoop Yarn调度器的选择和使用

一、引言 Yarn在Hadoop的生态系统中担任了资源管理和任务调度的角色。在讨论其构造器之前先简单了解一下Yarn的架构。 上图是Yarn的基本架构,其中ResourceManager是整个架构的核心组件,它负...

p柯西 ⋅ 今天 ⋅ 0

uWSGI + Django @ Ubuntu

创建 Django App Project 创建后, 可以看到路径下有一个wsgi.py的问题 uWSGI运行 直接命令行运行 利用如下命令, 可直接访问 uwsgi --http :8080 --wsgi-file dj/wsgi.py 配置文件 & 运行 [u...

袁祾 ⋅ 今天 ⋅ 0

JVM堆的理解

在JVM中,我们经常提到的就是堆了,堆确实很重要,其实,除了堆之外,还有几个重要的模块,看下图: 大 多数情况下,我们并不需要关心JVM的底层,但是如果了解它的话,对于我们系统调优是非常...

不羁之后 ⋅ 昨天 ⋅ 0

推荐:并发情况下:Java HashMap 形成死循环的原因

在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历...

码代码的小司机 ⋅ 昨天 ⋅ 2

聊聊spring cloud gateway的RetryGatewayFilter

序 本文主要研究一下spring cloud gateway的RetryGatewayFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gateway/config/G......

go4it ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部