文档章节

Android源码设计模式解析与实战(十二)

_
 _OUTMAN_
发布于 2017/02/26 21:18
字数 465
阅读 4
收藏 0

1. 观察者模式定义

定义对象间一种一对多的依赖关系,使的每当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新

2. 观察者模式的使用场景

(1) 关联行为场景,需要注意的是,关联行为是可拆分的,而不是"组合"关系。

(2) 事件多级触发场景。

(3) 跨系统的消息交换场景,如消息队列、事件总线的处理机制。

3. Android源码分析

ListView最重要的一个功能就是Adapter,通常我们往ListView添加数据后,都会调用Adapter的notifyDataSetChanged()方法。

public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter {
    // 数据采集观察者
    private final DataSetObservable mDataSetObservable = new DataSetObservable();
    ......
    public void registerDataSetObserver(DataSetObserver observer) {
        mDataSetObservable.registerObserver(observer);
    }
    public void unregisterDataSetObserver(DataSetObserver observer) {
        mDataSetObservable.unregisterObserver(observer);
    }
    /**
     * 当数据集变化时,通知所有观察者
     */
    public void notifyDataSetChanged() {
        mDataSetObservable.notifyChanged();
    }
}
/**
 * 数据集观察者
 */
public class DataSetObservable extends Observable<DataSetObserver> {
    /**
     * 调用每个观察者的onChanged函数来通知它们被观察者发生了变化
     */
    public void notifyChanged() {
        // 调用所有观察者的onChanged方式
        for (int i = mObservers.size() - 1; i >= 0; i--) {
            mObservers.get(i).onChanged();
        }
    }
    ......
}

这些观察者就是ListView通过setAdapter方法设置产生的。

public void setAdapter(ListAdapter adapter) {
    // 如果已经有一个Adapter,那么先注销该Adapter对应的观察者
    if (mAdapter != null && mDataSetObserver != null) {
        mAdapter.unregisterDataSetObserver(mDataSetObserver);
    }
    ......
    super.setAdapter(adapter);
    if (mAdapter != null) {
        ......
        mDataSetObserver = new AdapterDataSetObserver();
        mAdapter.registerDataSetObserver(mDataSetObserver);
    } else {
        ......
    }
}

总结下,AdapterView中有一个内部类AdapterDataSetObserver,在ListView中设置Adapter时会构建一个AdapterDataSetObserver,并且注册到Adapter中。而Adapter中包含一个数据集看观察者DataSetObservable,在数据集发生变化时,开发者手动调用Adapter.notifyDataSetChanged,继而会遍历所有观察者的onChanged函数,然后调用ListView的requestLayout()重新布局,更新用户界面。

© 著作权归作者所有

共有 人打赏支持
_
粉丝 20
博文 130
码字总数 55043
作品 0
海淀
程序员
ListView 数据与UI更新机制之观察者模式

之前有一篇文章专门介绍观察者模式知识,当时通过EventBus来进行分析。近日在读《Android源码设计模式解析与实战》,看到书中介绍ListView中使用到观察者模式。为了加深对观察者模式的理解,...

Tifkingsly
07/13
0
0
Android 网络编程 目录

Android 网络编程 目录 Android 网络编程1 Http协议 to be continued... Android 架构师之路 目录 Android 架构师之路1 UML图之用例图 Android 架构师之路2 UML图之类图 Android 架构师之路3...

香沙小熊
06/21
0
0
Android中的设计模式之工厂方法模式

参考 《设计模式:可复用面向对象软件的基础 》3.3 Factory method 对象创建型模式 《Android源码设计模式解析与实战》第5章 应用最广泛的模式--工厂方法模式 意图 定义一个用于创建对象的接...

newtrek
08/12
0
0
代理模式(Proxy Pattern):动态代理 - 最易懂的设计模式解析

前言 今天我来全面总结开发中最常用的设计模式 - 代理模式中的动态代理模式 其他设计模式介绍 1分钟全面了解“设计模式” 单例模式(Singleton) - 最易懂的设计模式解析 简单工厂模式(Sim...

Carson_Ho
04/09
0
0
缅甸银河国际赌场开户13170533331

1.概念:将内容与控件相分离的一种设计(公式) ,达到内容灵活显示的目的。 2.适配器模式主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。单独讲解接口的适配器模式 a. 接...

银河国际
05/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

这些Spring中的设计模式,你都知道吗?

设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆。 Spring作为业界的经典框架,无论是在架构设计方面,还是在代码编写方面,都堪称行...

Java填坑之路
19分钟前
1
0
Spring Aop原理之Advisor过滤

在上文(Spring Aop之Advisor解析)中我们讲到,Spring Aop对目标bean的代理主要分为三个步骤:获取所有的Advisor,过滤当前bean可应用的Advisor和使用Advisor为当前bean生成代理对象,并且上文...

爱宝贝丶
30分钟前
0
0
JMockit学习教程

1 JMockit中文网 我觉得如果仅仅是开发自测的话,把JMockit中文网认真看一遍,就可以在项目中使用JMockit了。 http://jmockit.cn/index.htm 2 JMockit中文教程 官方文档中文版。对于不喜欢看...

SuperHeroes
42分钟前
0
0
Linux服务器几乎从不采用Arch Linux?

我们见得多的Linux服务器系统一般都是什么Ubuntu Server啊,什么Cent OS啊,什么Fedora啊,或者企业采用的Red Hat啊,为什么几乎没有Arch Linux呢?下面我将从若干个方面指出Arch Linux在服务...

linux-tao
53分钟前
0
0
js 函数柯里化 闭包

参考 https://mp.weixin.qq.com/s/GEHL3jarDdAAcr5tQGjmDg 一个统计求和的函数 需要知道整个数组的信息,然后遍历求值 function countMoney() { let money = 0 // 温馨提示:arguments...

阿豪boy
55分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部