以下纯粹为自己的理解:
Observer观察者;
Observable 被观察者;
1.根据文档,Observable有一个管理者的集合,在数据发生改变时,可以通知所有观察者对象;
2.在构建观察者时,需要加入到被观察者的集合中,被观察者发现在数据改变时,调用setChanged(),标记位,notifyObservers()执行,并可以传递数据;
3.在Observer中,回调update(),得到数据根据需要执行下一步;
4.在Observer对象销毁前一定要用deleteObserver将其从列表中删除,不然因为还存在对象引用的关系,Observer对象不会被垃圾收集,造成内存泄漏,并且已死的Observer仍会被通知到,有可能造成意料外的错误,而且随着列表越来越大,notifyObservers操作也会越来越慢。
附上Observable方法:
addObserver
public void addObserver(Observer o)
- 如果观察者与集合中已有的观察者不同,则向对象的观察者集中添加此观察者。未指定向多个观察者发送通知的顺序。请参阅该类的注释。
-
-
参数:
-
o
- 要添加的观察者。
抛出:
-
NullPointerException
- 如果参数 o 为 null。
-
deleteObserver
public void deleteObserver(Observer o)
-
从对象的观察者集合中删除某个观察者。向此方法传递
null
将使其无效。 -
-
参数:
-
o
- 要删除的观察者。
-
notifyObservers
public void notifyObservers()
-
如果
hasChanged
方法指示对象已改变,则通知其所有观察者,并调用clearChanged
方法来指示此对象不再改变。每个观察者都有其
update
方法,其调用参数有两个:observable 对象和null
。换句话说,此方法等效于:notifyObservers(null)
notifyObservers
public void notifyObservers(Object arg)
-
如果
hasChanged
方法指示对象已改变,则通知其所有观察者,并调用clearChanged
方法来指示此对象不再改变。每个观察者都有其
update
方法,其调用参数有两个:observable 对象和arg
参数。 -
-
参数:
-
arg
- 任意对象。
另请参见:
-
clearChanged()
,hasChanged()
,Observer.update(java.util.Observable, java.lang.Object)
-
deleteObservers
public void deleteObservers()
- 清除观察者列表,使此对象不再有任何观察者。
-
setChanged
protected void setChanged()
- 标记此 Observable 对象为已改变的对象;现在 hasChanged 方法将返回 true。
-
clearChanged
protected void clearChanged()
-
指示对象不再改变,或者它已对其所有的观察者通知了最近的改变,所以
hasChanged 方法将返回
false。
notifyObservers
方法自动调用此方法。
hasChanged
public boolean hasChanged()
- 测试对象是否改变。
-
-
返回:
-
当且仅当在此对象上最近调用了
setChanged
方法,而不是clearChanged
方法时,才返回true
;否则返回false
。
另请参见:
-
clearChanged()
,setChanged()
-
当且仅当在此对象上最近调用了
countObservers
public int countObservers()
- 返回 Observable 对象的观察者数目。
-
-
返回:
- 对象的观察者数目。