文档章节

关于Message

 梦想家Peng
发布于 2016/03/03 11:06
字数 632
阅读 24
收藏 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
博文 34
码字总数 15605
作品 0
深圳
JavaScript异步编程大冒险: Async/Await

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

沉迷学习中
2017/12/21
0
0
基于 Giiwa 框架的 Message 模块--Giiwa-Message

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

joe-j
2016/09/29
266
0
关于Jackson注解无效

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

feihui
2014/11/06
2.5K
1
怎么写一个好的 Git commit message

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

liuchengxu
2017/10/10
0
0
关于Shiro和groovy的问题

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

kryptolith
2011/07/07
353
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

java并发备忘

不安全的“先检查后执行”,代码形式如下: if(条件满足){ //这里容易出现线程安全问题//doSomething}else{//doOther} 读取-修改-写入 原子操作:使用CAS技术,即首先从V中读取...

Funcy1122
今天
0
0
SpringBoot2.0 停机

最近新建了个SpringBoot2.0的项目,因为原来一直使用的是传统的Tomcat部署war包的形式,所以这次SpringBoot内置Tomcat部署jar包的时候遇到了很多问题。其中一个就是因为没有外置的Tomcat容器...

Canaan_
昨天
0
1
Confluence 6 外部参考

一个外部参考的意思是任何站点链接到你 Confluence 的实例。任何时候当 Confluence 的用户单击这个外部链接的时候,Confluence 可以记录这次单击为参考。 在默认的情况下,外部链接的参考链接...

honeymose
昨天
0
0
Android中的设计模式之抽象工厂模式

参考 《设计模式解析》 第十一章 Abstract Factory模式 《设计模式:可复用面向对象软件的基础 》3.1 Abstract Factory 抽象工厂 对象创建型模式 《Android源码设计模式解析与实战》第6章 创...

newtrek
昨天
0
0
Redis | 地理空间(GEO)的一个坑

Redis的地理空间(Geo)是个好东西,轻轻松松的就可以把地图描点的问题处理了, 最近却遇到一个坑...Redis采用的Msater-Slave模式, 运用GEORADIUS在salve读取对应的数据,新增了从节点但是从不返...

云迹
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部