Android设计模式之观察者模式.doc_第1页
Android设计模式之观察者模式.doc_第2页
Android设计模式之观察者模式.doc_第3页
Android设计模式之观察者模式.doc_第4页
Android设计模式之观察者模式.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/* * (Subject)(Observer)* * MVCObserverObserver* SubjectObserver* * * * Observer* * 1. * * 2. * 3. * * 1. Subject* * * 2. Observer* * 3. ConcreteSubject* ConcreteObserver* * 4. ConcreteObserver* ConcreteObserver* * Observer* */UMLAndroid.DataSetObserverObservable<T>DataSetObserverableObserver()DataSetObserver2framework/base/core/java/android/database/DataSetObserver.javapackage android.database;/* Receives call backs when a data set has been changed, or made invalid. The typically data sets* that are observed are link Cursors or link android.widget.Adapters.* 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 nothingSubject()Observable<T>observerframework/base/core/java/android/database/Observable.javapackage android.database;import java.util.ArrayList;/* Provides methods for (un)registering arbitrary observers in an ArrayList.*/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 observer*/public void unregisterAll() synchronized(mObservers) mObservers.clear();ConcreateSubject()OberverArrayList<Observer>Oberveractionframework/base/core/java/android/database/DataSetObservable.javapackage android.database;/* A specialization of Observable for DataSetObserver that provides methods for* invoking the various callback methods of DataSetObserver.*/public class DataSetObservable extends Observable<DataSetObserver> /* Invokes onChanged on each observer. Called when the data set being observed has* changed, and which when read contains the new state of the data.*/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 onInvalidated on each observer. Called when the data set being monitored* has changed such that it is no longer valid.*/public void notifyInvalidated() synchronized (mObservers) for (int i = mObservers.size() - 1; i >= 0; i-) mObservers.get(i).onInvalidated();ConcreateObserver(),actionandroidframework/base/core/java/android/widget/AbsListView.javaclass AdapterDataSetObserver extends AdapterView<ListAdapter>.AdapterDataSetObserver Overridepublic void onChanged() super.onChanged();if (mFastScroller != null) mFastScroller.onSectionsChanged();Overridepublic void onInvalidated() super.onInvalidated();if (mFastScroller != null) mFastScroller.onSectionsChanged();framework/base/core/java/android/widget/AdapterView.javaclass AdapterDataSetObse()rver extends DataSetObserver private Parcelable mInstanceState = null;Overridepublic void onChanged() mDataChanged = true;mOldItemCount = mItemCount;mItemCount = getAdapter().getCount();if (DBG) Xlog.d(TAG, "AdapterView onChanged: mOldItemCount = " + mOldItemCount+ ",mItemCount = " + mItemCount + ",getAdapter() = " + getAdapter()+ ",AdapterView = " + AdapterView.this, new Throwable("onChanged");/ Detect the case where a cursor that was previously invalidated has/ been repopulated with new data.if (AdapterView.this.getAdapter().hasStableIds() && mInstanceState != null&& mOldItemCount = 0 && mItemCount > 0) AdapterView.this.onRestoreInstanceState(mInstanceState);mInstanceState = null; else rememberSyncState();checkFocus();requestLayout();Overridepublic void onInvalidated() mDataChanged = true;if (DBG) Xlog.d(TAG, "AdapterView onInvalidated: mOldItemCount = " + mOldItemCount+ ",mItemCount = " + mItemCount + ",getAdapter() = " + getAdapter()+ ",AdapterView = " + AdapterView.this, new Throwable("onInvalidated");if (AdapterView.this.getAdapter().hasStableIds() / Remember the current state for the case where our hosting activity is being/ stopped and later restartedmInstanceState = AdapterView.this.onSaveInstanceState();/ Data is invalid so we should reset our statemOldItemCount = mItemCount;mItemCount = 0;mSelectedPosition = INVALID_POSITION;mSelectedRowId = INVALID_ROW_ID;mNextSelectedPosition = INVALID_POSITION;mNextSelectedRowId = INVALID_ROW_ID;mNeedSync = false;checkFocus();requestLayout();public void clearSavedState() mInstanceState = null;BaseAdapterBaseAdapterDataSetObservableregisterDataSetObserverunregisterDataSetObserverObservernotifyDataSetChangedObserveronChange()ListViewBaseAdapterBaseAdapteritemnotifyDataSetChanged()ListviewBaseAdapterregisterDataSetObserver(DataSetObserver observer)ObserverListviewListView/* Sets the data behind this ListView.* The adapter passed to this method may be wrapped by a link WrapperListAdapter,* depending on the ListView features currently in use. For instance, adding* headers and/or footers will cause the adapter to be wrapped.* param adapter The ListAdapter which is responsible for maintaining the* data backing this list and for producing a view to represent an* item in that data set.* see #getAdapter()*/Overridepublic void setAdapter(ListAdapter adapter) if (mAdapter != null && mDataSetObserver != null) mAdapter.unregisterDataSetObserver(mDataSetObserver);resetList();mRecycler.clear();if (mHeaderViewInfos.size() > 0| mFooterViewInfos.size() > 0) mAdapter = new HeaderViewListAdapter(mHeaderViewInfos, mFooterViewInfos, adapter); else mAdapter = adapter;mOldSelectedPosition = INVALID_POSITION;mOldSelectedRowId = INVALID_ROW_ID;/ AbsListView#setAdapter will update choice mode states.super.setAdapter(adapter);if (mAdapter != null) mAreAllItemsSelectable = mAdapter.areAllItemsEnabled();mOldItemCount = mItemCount;mItemCount = mAdap

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论