handler总体思路:
假设:公开的队列QA,A线程,B线程,A私有的Looper对象,Looper对象有loop函数
A线程一开始便执行loop函数。
loop函数作用:一个死循环,不断查询队列QA中是否有对象,无则继续循环。有则取出对象,从该对象获取handle对象,调用该handle对象的dispatchMessage()方法,该方法默认就调用handleMessage()方法。
由文章所示的dispatchMessage()方法原型可见,使用post方法、手动设定回调mCallback、重写的handleMessage,优先度是依次下降的。
实际上app的入口,也就是
public static void main
,实际是让主线程执行loop函数,其他线程往队列里写入消息让主线程得以取出并执行对应函数。当消息队列被插入结束消息时,对应操作为主线程跳出(break)loop函数,从而结束app。
我们熟知的事件编程就是用了观察者模式实现。
观察者模式实现:事件源有一个数组,事件源的某些函数执行时会遍历一次数组对象并执行对象的特定方法。
说白了就是:某个对象有成员A[] arr;
,A类有方法void a(String text)
,某个对象setText(String text)
函数:
public void setText(String text){
for(A i : arr){
i.a(text);
}
this.text=text;
}
只要我们搞个B类来继承A类并重写方法a(),并把B的实例放进事件源的arr数组里面,这样每次调用setText()函数时,最终会调用我们写好的a()方法。如果不看具体实现,使用时感觉就像触发了事件一样。
只要再改改细节,使其符合java事件的进一步要求,我们就能称呼A类对象为事件监听器,称呼能够存放A类对象的为事件源,称呼传进方法a的参数为事件对象。
PS:可以看出来,以观察者模式实现的事件编程,没有涉及多线程,始终是一个线程运行到底。
网友评论