在Android中很多内容都用到了观察者模式,比如说BaseAdapterAbsListView View等都有,只是名字各有不同。

Observable表示被观察者,由于这个对象是一个抽象类只能被继承。而Observer表示观察者,它并不是一个类而是一个接口,所以观察者可以有多个,实现了该接口的类都属于观察者。

   观察者可以同时是被观察者,被观察者同样可以是观察者。

   当一个被观察的对象继承自Observable抽象类时,就表示该类可以被很多观察者(实现了Observer接口)观察,其实意思就是说这个对象也就是被观察者“上电视了”,电视前的你也就是观察者可以看,(对象发生变化)电视里被观察者做了别的动作,那么电视前的所有人看到的也就变了,在同一时间改变所有观众看到的画面。

 

1、观察者

(Observer)将自己注册到被观察对象(Subject)中,被观察对象将观察者存放在一个容器(Container)里。 

2、被观察对象 

被观察对象发生了某种变化,从容器中遍历所有注册过的观察者,将变化通知观察者。 

3、撤销观察 

观察者告诉被观察者要撤销观察,被观察者从容器中将观察者去除。 

 

   观察者模式的实现过程:“注册——通知——撤销注册”


被观察者不应该过问观察者的具体类型,而是应该使用观察者的接口。这样的优点是:假定程序中还有别的观察者,那么只要这个观察者也是相同的接口实现即可。一个被观察者可以对应多个观察者,当被观察者发生变化的时候,他可以将消息一一通知给所有的观察者。基于接口,而不是具体的实现——这一点为程序提供了更大的灵活性。

 

Android事件处理

 

Android observeForever和observe的区别 observe和obey的区别_事件源

 

示例代码如下图所示:

 

Android observeForever和observe的区别 observe和obey的区别_控件_02

 

 

 

常用的事件接口 

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对应的方法)。