原理
在一个循环下有多个线程,当一个线程休眠时另一个线程如何唤醒的呢?
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()。