您当前的位置:首页 > 计算机 > 编程开发 > 安卓(android)开发

Observable与Observer的使用

时间:02-05来源:作者:点击数:

这是JDK中自带的观察者实现,其中Observable是一个类,而Observer是一个接口。

Observable翻译过来意思为:可观察的,也可理解为数据类,大多数观察的情形是观察数据的变化,比如消息数据库,收到一条消息,我们就往数据库插入一条消息,界面上就应该监听这个数据库,这样就能知道有新消息了,就可以把新消息显示出来,或者别人撤回了一条消息,则数据库删除一条消息,则界面也应该能监听到,及时显示用户撤回了一条消息。

Observable的源码也很简单,一看就懂,总共有9个函数,这里简单总结一下:

  1. 使用Vector这种类型的集合来保存观察者,对于这个集合的操作函数都是同步的,所以多线程操作也没问题,对于操作观察者的函数有:

    • addObserver(Observer) 添加一个观察者
    • deleteObserver(Observer) 删除一个观察者
    • deleteObservers() 删除所有观察者
    • countObservers() 返回观察者的数量
  2. 有了观察者,当数据发生变化时就可以通知观察者了,但是在通知之前需要修改一个成员变量的值:boolean changed,当数据发生改变时要设置为true(需要手动操作),当通知了观察者之后要设置为false(不需要手动操作,notifyObservers函数内部会自动设置),使用changed变量的好处是可以预防一次改变多次通知,发生一次改变,你调用多次notifyObservers()函数,观察者也只会收到一次通知。对于changed变量操作的对应方法如下:

    • setChanged() 把chnaged设置为true
    • clearChanged() 把changed设置为false
    • hasChanged() 返回changed
  3. 当数据发生了变化时,就可以调用setChanged() ,然后就可以调用通知函数了,通知函数如下:

    • notifyObservers(Object arg) 通知所有的观察者,并传递一个arg参数
    • notifyObservers() 内部实现是:notifyObservers(null)
      通知的观察者的顺序是倒序通知,即后面添加的观察者会先收到通知。Observer是一个接口,且只有一个函数:update(Observable o, Object arg) ,调用Observable的notifyObservers(Object arg)的时候,就会遍历所有的Observer并调用它的update(Observable o, Object arg)函数。
  4. 写一个示例代码,情景为:模拟一个消息数据库,因为数据库拥有数据,所以可以继承Observable,以便它的数据可以被观察,比如当我们往消息数据库中插入一条消息时,观察者就会收到通知,示例代码如下:
    /** 消息数据库 */
    public class MessageDatabase extends Observable {
    
        private List<String> messages = new ArrayList<>();
    
        public void insertMessage(String message) {
            messages.add(message);
            setChanged();
            notifyObservers(message);
        }
    }
    
    /** 消息UI界面 */
    public class MessageUI {
    
        public static void main(String[] args) {
            MessageDatabase db = new MessageDatabase();
            db.addObserver((o, arg) -> {
                System.out.println(o.getClass().getSimpleName() + "中数据发生变化:" + arg);
            });
            db.insertMessage("恭喜你,获得VIP门票一张!");
        }
    }
    

    运行main函数,即可看到如下输出:

    MessageDatabase中数据发生变化:恭喜你,获得VIP门票一张!
    
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门