Android 线程通信

来源:互联网 发布:单片机语言是什么语言 编辑:程序博客网 时间:2024/05/18 18:21

Android是属于单线程模型,所有的界面更新都在主线程中完成,所以主线程也叫UI线程。由于Android中特有的ANR机制,当遇到耗时操作时,我们通常需要启动工作线程来完成耗时操作,对于工作线程的执行结果需要反映到界面上时,我们就需要工作线程和主线程之间的通信,同时,主线程在特定情况下也需要向工作线程发起通信,比如点击界面上的某个按钮,改变工作线程中正在执行的操作。下面就来讲讲线程之间的通信。

线程间通信方法:

1、在需要接受消息的线程中创建消息队列(MessageQueue)和与之匹配的轮询对象(Looper),两只之间存在着严格的一对一关系,一个消息队列只能与一个轮询对象相关联。Android中主线程默认包含了消息队列与轮询对象,工作线程默认没有消息队列和轮询对象,需要自己创建

2、创建Handler对象并与需要接受消息的线程中的消息队列相关联,注意,消息的处理方法也在该Handler对象中实现。

a)创建Handler时必须指定与之关联的消息队列,由于Looper对象与消息队列之间存在严格的一对一关系,所以一般在创建Handler时通过指定与之关联的Looper对象来指定Handler与消息队列的关联:

Handler handler = new Handler(Looper looper);

b)若创建Handler时未明确指定与之关联的消息队列,则该Handler对象在哪个线程中被创建,就默认关联到该线程。如果该线程中未创建消息队列,则Handler创建失败。

c)Handler对象只能向与之关联的消息队列发送消息。

3、在需要发送消息的线程中使用步骤2中创建的Handler对象发送消息。


PS:小技巧

1、Android中的消息(Message对象)是由一个消息池来维护的,所以创建消息对象的时候尽量不要NEW一个新的消息可以用一下两种方法:

Message msg = Message.obtain();
Message msg = handler.obtainMessage();
来获取消息对象。

2、在Handler中实现消息处理方法,除了重写Handler的handleMessage()方法外,还可在CallBack对象中实现handleMessage()方法,并在Handler构建是传入该CallBack对象,且Callback对象的执行优先级高于重写Handler的handleMessage()方法,Callback的handleMessage()方法会返回一个boolean值,若该值为true,则该消息被Callback消费,Handler中的handleMessage()方法不执行,为false时,先在callback的handleMessage中执行,再在Handler的handleMessage()方法中执行

Handler handler = new Handler(Callback callback);
3、对于包含Rannable对象的Message来说,Looper对象从消息队列中取出消息时会判断该消息是否包含Rannable对象,如果包含,则会直接在当前线程执行Rannable对象的中的run()方法,并结束消息处理,不会再交给该handler对象处理。
//构造包含Rannable对象的msgMessage msg = Message.obtain(Handler handler,Rannable callback);//或者直接handler.post(Rannable callback);

0 0
原创粉丝点击