文档章节

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

_
 _OUTMAN_
发布于 2017/02/26 21:18
字数 465
阅读 5
收藏 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()重新布局,更新用户界面。

© 著作权归作者所有

共有 人打赏支持
_
粉丝 21
博文 133
码字总数 63959
作品 0
海淀
程序员
私信 提问
ListView 数据与UI更新机制之观察者模式

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

Tifkingsly
2018/07/13
0
0
设计模式知识梳理(7) - 结构型 - 代理模式

一、基本概念 1.1 定义 为其他对象提供一种代理以控制对这个对象的访问。 1.2 例子 代理模式的角色分为以下几种: 抽象主题类:声明真实主题与代理的共同接口方法。 真实主题类:定义了代理所...

泽毛
2018/11/28
0
0
Android 网络编程 目录

Android 网络编程 目录 Android 网络编程1 Http协议 Android 网络编程2 Okhttp缓存机制 Android 网络编程3 Java NIO to be continued... Android 架构师之路 目录 Android 架构师之路1 UML图...

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

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

newtrek
2018/08/12
0
0
BAT等大厂Android面试书单和知识点清单

java是Android开发的基础,在BAT的初面中,会涉及到比较多的java基础知识,所以比较重要,下面我介绍的书籍内容是由浅到深。 1.Thinking in java:这本书被称为Java的三大圣经之一,虽然书比...

android自学
2018/07/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Python如何开发桌面应用程序?Python基础教程,第十三讲,图形界面

当使用桌面应用程序的时候,有没有那么一瞬间,想学习一下桌面应用程序开发?行业内专业的桌面应用程序开发一般是C++,C#来做,Java开发的也有,但是比较少。本节课会介绍Python的GUI(图形用...

程序员补给栈
今天
3
0
kafka在的使用

一、基本概念 介绍 Kafka是一个分布式的、可分区的、可复制的消息系统。它提供了普通消息系统的功能,但具有自己独特的设计。 这个独特的设计是什么样的呢? 首先让我们看几个基本的消息系统...

狼王黄师傅
今天
1
0
Android JNI总结

0x01 JNI介绍 JNI是Java Native Interface的缩写,JNI不是Android专有的东西,它是从Java继承而来,但是在Android中,JNI的作用和重要性大大增强。 JNI在Android中起着连接Java和C/C++层的作...

天王盖地虎626
昨天
1
0
大数据教程(11.8)Hive1.2.2简介&初体验

上一篇文章分析了Hive1.2.2的安装,本节博主将分享Hive的体验&Hive服务端和客户端的使用方法。 一、Hive与hadoop直接的关系 Hive利用HDFS存储数据,利用MapReduce查询数据。 二、Hive与传统数...

em_aaron
昨天
3
0
跟我学Spring Cloud(Finchley版)-15-Hystrix监控详解

Hystrix提供了监控Hystrix Command的能力,本节来详细探讨。 监控端点与数据 应用整合Hystrix,同时应用包含spring-boot-starter-actuator 依赖,就会存在一个/actuator/hystrix.stream 端点...

周立_ITMuch
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部