首页  ·  知识 ·  移动开发
安卓跨线程访问模型
网友   http://www.cnblogs.com/wmj/archive/2011/03/03/1969669.html  Android  编辑:dezai   图片来源:网络
有win32编程经验的人都懂,windows是基于消息驱动模式的,通过注册窗口回调函数来处理系统push的消息。安卓借鉴windows的消息模型,带有消息循环的
有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
   
免责声明:本站转载此文章旨在分享信息,不代表对其内容的完全认同。文章来源已尽可能注明,若涉及版权问题,请及时与我们联系,我们将积极配合处理。同时,我们无法对文章内容的真实性、准确性及完整性进行完全保证,对于因文章内容而产生的任何后果,本账号不承担法律责任。转载仅出于传播目的,读者应自行对内容进行核实与判断。请谨慎参考文章信息,一切责任由读者自行承担。
延伸阅读