android ViewPage 的观察者模式实现
来源:互联网 发布:matlab 最优化工具箱 编辑:程序博客网 时间:2024/05/22 14:21
【首先是观察者的管理,采用数组型集合,线程安全,泛型可拓展】
package com.android.zgx.androidday.database;import java.util.ArrayList;/** * Provides methods for registering or unregistering arbitrary observers in an {@link ArrayList}. * * This abstract class is intended to be subclassed and specialized to maintain * a registry of observers of specific types and dispatch notifications to them. * * @param T The observer type. 观察者的行为 */public abstract class Observable<T> { /** * The list of observers. An observer can be in the list at most * once and will never be null. */ protected final ArrayList<T> mObservers = new ArrayList<T>(); /** * Adds an observer to the list. The observer cannot be null and it must not already * be registered. * @param observer the observer to register * @throws IllegalArgumentException the observer is null * @throws IllegalStateException the observer is already registered */ public void registerObserver(T observer) { if (observer == null) { throw new IllegalArgumentException("The observer is null."); } synchronized(mObservers) { if (mObservers.contains(observer)) { throw new IllegalStateException("Observer " + observer + " is already registered."); } mObservers.add(observer); } } /** * Removes a previously registered observer. The observer must not be null and it * must already have been registered. * @param observer the observer to unregister * @throws IllegalArgumentException the observer is null * @throws IllegalStateException the observer is not yet registered */ public void unregisterObserver(T observer) { if (observer == null) { throw new IllegalArgumentException("The observer is null."); } synchronized(mObservers) { int index = mObservers.indexOf(observer); if (index == -1) { throw new IllegalStateException("Observer " + observer + " was not registered."); } mObservers.remove(index); } } /** * Remove all registered observers. */ public void unregisterAll() { synchronized(mObservers) { mObservers.clear(); } }}
【接着,定义数据变化的行为】
package com.android.zgx.androidday.database;import android.database.Cursor;/** * Receives call backs when a data set has been changed, or made invalid. The typically data sets * that are observed are {@link Cursor}s or {@link android.widget.Adapter}s. * DataSetObserver must be implemented by objects which are added to a DataSetObservable. */public abstract class DataSetObserver { /** * This method is called when the entire data set has changed, * most likely through a call to {@link Cursor#requery()} on a {@link Cursor}. */ public void onChanged() { // Do nothing } /** * This method is called when the entire data becomes invalid, * most likely through a call to {@link Cursor#deactivate()} or {@link Cursor#close()} on a * {@link Cursor}. */ public void onInvalidated() { // Do nothing }}
【然后,组织调用,数组遍历调用,线程安全】
package com.android.zgx.androidday.database;/** * A specialization of {@link Observable} for {@link DataSetObserver} * that provides methods for sending notifications to a list of * {@link DataSetObserver} objects. * * 一个个调用 */public class DataSetObservable extends Observable<DataSetObserver> { /** * Invokes {@link DataSetObserver#onChanged} on each observer. * Called when the contents of the data set have changed. The recipient * will obtain the new contents the next time it queries the data set. */ public void notifyChanged() { synchronized(mObservers) { // since onChanged() is implemented by the app, it could do anything, including // removing itself from {@link mObservers} - and that could cause problems if // an iterator is used on the ArrayList {@link mObservers}. // to avoid such problems, just march thru the list in the reverse order. for (int i = mObservers.size() - 1; i >= 0; i--) { mObservers.get(i).onChanged(); } } } /** * Invokes {@link DataSetObserver#onInvalidated} on each observer. * Called when the data set is no longer valid and cannot be queried again, * such as when the data set has been closed. */ public void notifyInvalidated() { synchronized (mObservers) { for (int i = mObservers.size() - 1; i >= 0; i--) { mObservers.get(i).onInvalidated(); } } }}
【最后才是ViewPage数据变化,观察者的实现】
private class PagerObserver extends DataSetObserver { @Override public void onChanged() { dataSetChanged(); } @Override public void onInvalidated() { dataSetChanged(); } }
【结束语】
这里主要讲解的是设计模式,ViewPage 的具体观察实现,后续.....
0 0
- android ViewPage 的观察者模式实现
- Android中viewpage的实现
- Android观察者模式的简单实现demo
- Android观察者模式的简单实现demo
- android实现ViewPage效果的TabActivity
- Android中Viewpage+Fragment的简单实现
- Android观察者模式简单实现
- 一个类实现Android观察者模式(最简单实用的观察者模式)
- Android ListView与BaseAdapter的观察者模式实现
- android实现观察者模式的几种方法
- 观察者模式的简单实现
- 观察者模式的java实现
- swift观察者模式的实现
- swift观察者模式的实现
- 简单实现的观察者模式
- 观察者模式的C#实现
- android viewpage的使用
- android viewpage的施用
- css实现多行文本垂直水平居中
- 剑指Offer面试题18(Java版):树的子结构
- 10.06
- 我的第一次博客之旅
- Ubuntu GNOME 16.10 Beta 1问世了!
- android ViewPage 的观察者模式实现
- SPOJ Highways(生成树计数)
- 【JZOJ1282】打工
- java中视图值的应用
- My SQL 系统函数
- Javascript中的原型链、prototype、__proto__的关系
- ”Python开发简单爬虫“慕课网课程学习笔记1
- 计算时间复杂度
- Codeforces 414B Mashmokh and ACM【预处理+dp】