Wei_Android_1_基础知识Android消息处理机制

原理

 在一个循环下有多个线程,当一个线程休眠时另一个线程如何唤醒的呢?

 1、通过epoll机制,当没有数据时就休眠,有数据就立刻唤醒。

2、A线程不断地发送消息给B线程,当B线程消息处理不过来时,得用消息队列

 Android源码分析

创建prepare时最终该线程会调用到Looper()。

其中public static void prepare() 怎么调用到private static void 怎么调用到的现在搞不懂。


在Loopre中创建一个消息队列 。

 Handler发送消息, Looper存储消息

Looper中循环处理消息。

处理过程,在loop中有个for循环,从队列里面拿出消息,当找到msg后调用dispatchMessage(msg)去处理msg。其中的target为handler。

 在handler中调用callback来处理,此callback为注册handler时所注册的handler。

 DEMO例子

创建Thread时调用run()run中会新建looper。

再创建Handler,功能为获取Looper,将消息队列的数据取出调用Callback函数。

 按键后会执行创建一个Message 再发送

问题

存在于getLooper中当myThread2启动时会调用run函数,不过有可能run下的preper不会立即执行。如果没有创建getLooper那mHandler中的getLooper就会出错。

解决办法

1、如果线程还没有激活就返回null。

2、如果线程激活但是mLooper为null就wait();

3、当mLooper注册成功后再通知所有notifyAll()。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值