Android线程间通信机制(handler,looper)

本文深入解析Android中的消息机制,包括Looper、Handler与MessageQueue的工作原理及其交互方式。介绍了如何在主线程与子线程间通过Handler传递消息,实现UI更新与后台任务处理的有效分离。

android应用程序运行时,一个主线程被创建(也称作UI线程),此线程主要负责处理UI相关的事件,由于Android采用UI单线程模型,所以只能在主线程中对UI元素进行操作,如果在非UI线程直接对UI进行了操作,则会报错,另外,对于运算量较大的操作和IO操作,我们需要新开线程来处理这些工作,以免阻塞UI线程,子线程与主线程之间是怎样进行通信的呢?此时就要采用消息循环机制(Looper)Handler进行处理。

一、基本概念
ThreadLocal
保证了每个线程都有自己的Looper对象。在android中主线程启动会创建属于自己的looper对象,这时候如果我们在去调用prepare就会抛Only one Looper may be created per thread;但子线程并不会自己创建looper对象,需要我们手动调用prepare创建属于该线程的looper对象。

Looper:每一个线程都可以产生一个Looper,用来管理线程的MessageLooper对象会建立一个MessgaeQueue数据结构来存放message

Handler:Looper沟通的对象,可以push消息或者runnable对象到MessgaeQueue,也可以从MessageQueue得到消息。

查看其构造函数:

Handler()

Default constructor associates this handler with the queue forthe current thread.//如不指定Looper参数则默认利用当前线程的Looper创建

Handler(Looper looper)

Use the provided queue instead of the default one.//使用指定的Looper对象创建Handler

线程AHandler对象引用可以传递给别的线程,让别的线程BC等能送消息来给线程A

线程AMessage Queue里的消息,只有线程A所属的对象可以处理。

注意:Android里没有globalMessageQueue,不同进程(APK之间)不能通过MessageQueue交换消息。

二、Handler通过Message通信的基本方式

使用Looper.myLooper可以取得当前线程的Looper对象。

使用mHandler = new Handler(Looper.myLooper()); 可产生用来处理当前线程的Handler对象。

使用mHandler = new Handler(Looper.getMainLooper()); 可诞生用来处理main线程的Handler对象。

使用Handler传递消息对象时将消息封装到一个Message对象中,Message对象中主要字段如下:

public int arg1 当需要传递的消息是整形时arg1 arg2 是一种低成本的可选方案,他使用 setData()/getData()访问或修改字段。

public int arg2 同上

public Object obj 可传送的任意object类型.

public int what Int类型用户自定义的消息类型码

Message对象可以通过Message类的构造函数获得,但Google推荐使用Message.obtain()方法获得,该方法会从全局的对象池里返回一个可复用的Messgae实例,API中解释如下:

Message()

Constructor (but the preferred way to get a Message is to callMessage.obtain()).

Handler发出消息时,既可以指定消息被接受后马上处理,也可以指定经过一定时间间隔之后被处理,如sendMessageDelayed(Message msg, long delayMillis),具体请参考API

Handler消息被发送出去之后,将由handleMessage(Message msg)方法处理。

注意:在Android里,新诞生一个线程,并不会自动建立其Message Loop

可以通过调用Looper.prepare()为该线程建立一个MessageQueue,再调用Looper.loop()进行消息循环。


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值