Android中的线程通信

来源:互联网 发布:js获取body元素 编辑:程序博客网 时间:2024/06/08 06:35
在ANDROID系统中,可以依赖Handler和Message实现线程间的通信,这种机制也被称之为消息机制
Handler:用于发送和处理Message,在主线程中创建的Handler默认是运行在主线程的,所以,使用Handler可以控制各个控件的显示
Message:消息的载体
发送消息:使用Handler对象的sendMessage(Message msg)方法发送消息
接受消息:不需要开发者考虑
处理消息:自定义类继承Handler,并重写public void handleMessage(Message msg)方法,决定如何处理消息

在消息(Message)中封装数据:可以使用Message的int arg1、int arg2、Object obj属性封装数据

关于Message对象
----------------------------------------
Message类有公有的无参数的构造方法,开发者可以随意创建Message对象,但是,Message对象大多是被处理后就没有存在的意义了,所以反复创建Message对象会无谓的消耗内存
推荐使用Message.obtain()方法获取消息的对象,Message类自身使用了“Message池”对消息对象进行管理,从而可以控制产生的Message对象的数量
如果使用的Message.obtain()方法中,使用到了Handler做为参数,则需要使用Message对象的sendToTarget()发送消息,而不再使用Handler的sendMessage()系列方法
Message的what属性用于标识消息的类型(因为子线程可能向主线程发送若干种不同的消息),不应该用于封装有具体数值含义的数据,通常,what属性的值应该使用静态常量表示,例如msg.what = MESSAGE_UPDATE_CLOCK;
通过Handler对象的obtainMessage()系列方法也可以获取Message对象,其实现效果与Message类的obtain()方法是等效的


关于Handler.Callback
----------------------------------------
使用Handler.Callback接口的实现类对象,做为Handler构造方法的参数,也可以实现对消息的处理【推荐】
Handler.Callback定义了public boolean handleMessage(Message msg)方法,其中,返回值(boolean类型)表示“是否已经完全处理了消息”,当返回值为false时,如果存在其它的消息处理方法,则对应的代码也会被执行,当返回值为true时,表示“已经完全处理了消息”,则其它的处理消息的代码不会运行


关于处理消息的方式
----------------------------------------
1) 使用Message.obtain(Handler h, Runnable callback)中的Runnable对象处理消息
2) 使用Handler.Callback处理消息
3) 重写Handler类的handleMessage()处理消息
以上3种方式可以并存,优先级为1 -> 2 -> 3
当存在第1种方式时,消息将直接被处理,并且不会向后传递
当第2种方式存在时,其public boolean handleMessage(Message msg)方法的返回值决定消息是否向后传递

0 0