有win32编程经验的人都懂,windows是基于消息驱动模式的,通过注册窗口回调函数来处理系统push的消息。安卓借鉴windows的消息模型,带有消息循环的线程都有自己的Looper,MessageQueue消息队列和Handler,这里的Handler就是win32中注册的窗口回调函数,不同于win32的是,这里的Handler对象不但能接受消息,还能向MessageQueue中push消息,下面来看一下他们之间的关系。
.NET CF框架中,UI是非线程安全的,工作线程不能直接修改UI线程中的UI属性;kjava没这麽麻烦,kjava允许工作线程直接修改UI线程中的UI属性,问题是多任务的时候,要考虑UI资源的同步问题;安卓平台中,UI组件也是非线程安全的,不允许工作线程直接修改UI线程的UI组件,那么安卓是怎么处理的呢?
安卓平台中消息线程都维护自己的消息队列,Looper,Handler,在A线程中,可以通过B线程的HandlerB向B线程的消息队列中push消息,B线程的HandlerB从自己的消息队列中获得并处理消息。可以看到跨线程访问的关键在于Handler,通过对方的Handler往对方的消息队列中push消息。
下面是伪代码
1.申明主线程和工作线程的Handler;
private Handler mMainHandler, mChildHandler;
2.在主线程中,用工作线程的mChildHandler发送消息;
3.在工作线程中,用工作线程的mChildHandler处理消息;
4.反之也是如此;
细心的朋友可能会发现, mChildHandler对象在主线程和工作线程中都有调用,难道不存在线程同步安全问题?
本文作者:网友 来源:网络 http://www.cnblogs.com/wmj/archive/2011/03/03/1969669.html
CIO之家 www.ciozj.com 微信公众号:imciow