文档章节

关于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
关于通知处理逻辑的伪代码

ini message list(): // do it after user login. 将消息的更新存储到redis 的 user 实例上 create message(): // 根据给定的type和参数列表,来构造message json 数据. switch type set mes......

Burningbear
2016/08/28
1
0
关于Jackson注解无效

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

feihui
2014/11/06
3.1K
1
websocket sockJs 重连机制

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

594zzb
2017/05/18
581
0

没有更多内容

加载失败,请刷新页面

加载更多

FTP 协议 1.0

自己制作的FTP协议:

Explorer0
19分钟前
1
0
Android 通过DrawableInflater加载自定义Drawable

一、Drawable 在Android系统张,图形图像的绘制需要在画布上进行操作和处理,但是绘制需要了解很多细节以及可能要进行一些复杂的处理,因此系统提供了一个被称之为Drawable的类来进行绘制处理...

IamOkay
30分钟前
1
0
灵活无处安放,所以选择流浪....《漆黑的空间》& 《灰色轨迹》

灵活无处安放,所以选择流浪....《漆黑的空间》& 《灰色轨迹》

yizhichao
37分钟前
1
0
Kafka+Flink 实现准实时异常检测系统

1.背景介绍 异常检测可以定义为“基于行动者(人或机器)的行为是否正常作出决策”,这项技术可以应用于非常多的行业中,比如金融场景中做交易检测、贷款检测;工业场景中做生产线预警;安防...

架构师springboot
今天
7
0
DecimalFormat 类基本使用

/* * DecimalFormat 类主要靠 # 和 0 两种占位符号来指定数字长度 * 0 表示如果位数不足则以 0 填充 * # 表示只要有可能就把数字拉上这个位置 * */ public static void main(String[] args){...

嘴角轻扬30
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部