在Android中很多内容都用到了观察者模式,比如说BaseAdapterAbsListView View等都有,只是名字各有不同。
Observable表示被观察者,由于这个对象是一个抽象类只能被继承。而Observer表示观察者,它并不是一个类而是一个接口,所以观察者可以有多个,实现了该接口的类都属于观察者。
观察者可以同时是被观察者,被观察者同样可以是观察者。
当一个被观察的对象继承自Observable抽象类时,就表示该类可以被很多观察者(实现了Observer接口)观察,其实意思就是说这个对象也就是被观察者“上电视了”,电视前的你也就是观察者可以看,(对象发生变化)电视里被观察者做了别的动作,那么电视前的所有人看到的也就变了,在同一时间改变所有观众看到的画面。
1、观察者
(Observer)将自己注册到被观察对象(Subject)中,被观察对象将观察者存放在一个容器(Container)里。
2、被观察对象
被观察对象发生了某种变化,从容器中遍历所有注册过的观察者,将变化通知观察者。
3、撤销观察
观察者告诉被观察者要撤销观察,被观察者从容器中将观察者去除。
观察者模式的实现过程:“注册——通知——撤销注册”
被观察者不应该过问观察者的具体类型,而是应该使用观察者的接口。这样的优点是:假定程序中还有别的观察者,那么只要这个观察者也是相同的接口实现即可。一个被观察者可以对应多个观察者,当被观察者发生变化的时候,他可以将消息一一通知给所有的观察者。基于接口,而不是具体的实现——这一点为程序提供了更大的灵活性。
Android事件处理
示例代码如下图所示:
常用的事件接口
OnClickListener 处理点击事件。
重写的方法: OnClick(View v)
参数:v是事件源控件
OnLongClickListener 处理View长按事件。
重写的方法: OnLongClick(View v)
参数:v是事件源控件
OnFocusChangeListener用来处理控件焦点发生改变(失去或获得)的事件。 重写的方法: OnFocusChange (View v,Boolean hasFocus)
参数:v同上
hasFocus是否获得焦点
OnKeyListener通过对某个View注册该监听,当View获得焦点并有键盘事件时,便会触发该接口中的回调方法。
重写的方法: OnKey(View v,int keyCode,KeyEvent event)
参数:v同上
keyCode为手机键盘的键盘码
event为键盘事件封装类对象,包含了事件的详细信息,如事件类型等。
OnTouchListener用来处理手机屏幕事件的监听接口,当为View的范围内触摸按下、抬起或滑动等动作都会触发该事件。
重写的方法: OnTouch(View v,MotionEvent event) 参数:v同上
event为事件封装类对象,封装了触发时间的详细信息,同样包括事件的类型、触发时间等信息。使用event.getAction==MotionEvent.ACTION_XXX的形式(还要重写XXX对应的方法)。