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

原理

 在一个循环下有多个线程,当一个线程休眠时另一个线程如何唤醒的呢?Wei_Android_1_基础知识Android消息处理机制_第1张图片

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

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

Wei_Android_1_基础知识Android消息处理机制_第2张图片

 Android源码分析

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

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


Wei_Android_1_基础知识Android消息处理机制_第3张图片

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

Wei_Android_1_基础知识Android消息处理机制_第4张图片

 Handler发送消息, Looper存储消息

Wei_Android_1_基础知识Android消息处理机制_第5张图片

Looper中循环处理消息。

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

Wei_Android_1_基础知识Android消息处理机制_第6张图片

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

Wei_Android_1_基础知识Android消息处理机制_第7张图片

 DEMO例子

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

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

Wei_Android_1_基础知识Android消息处理机制_第8张图片

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

问题

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

解决办法

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

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

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

Wei_Android_1_基础知识Android消息处理机制_第9张图片

 

你可能感兴趣的:(android,java,apache)