synchronized (mSelfObserverLock) {
mContentObservable.dispatchChange(selfChange);
if (mNotifyUri != null && selfChange) {
mContentResolver.notifyChange(mNotifyUri, mSelfObserver);
}
}
}
protected void notifyDataSetChange() {
mDataSetObservable.notifyChanged();
}
}
再看看Observable类和DataSetObservable类:
public abstract class Observable {
/**
- 观察者列表
*/
protected final ArrayList mObservers = new ArrayList();
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);
}
}
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);
}
}
public void unregisterAll() {
synchronized(mObservers) {
mObservers.clear();
}
}
}
和
public class DataSetObservable extends Observable {
/**
- 数据发生变化时,通知所有的观察者
*/
public void notifyChanged() {
synchronized(mObservers) {
for (DataSetObserver observer : mObservers) {
observer.onChanged();
}
}
}
//… … (其他方法)
}
观察者DataSetObserver类是一个抽象类:
public abstract class DataSetObserver {
public void onChanged() {
// Do nothing
}
}
所以我们具体看它的子类:
public class AlphabetIndexer extends DataSetObserver{
/*
- @hide 被android系统隐藏起来了
*/
@Override
public void onChanged() {
//观察到数据变化,观察者做自己该做的事情
super.onChanged();
mAlphaMap.clear();
}
}
ContentObserver也是类似。
4.效果
(1).行为型模式
(2).目标和观察者间的抽象耦合(经典实现)。
(3).支持广播通信(相信这点android开发者看到后应该有启发吧)。
(4).注意意外的更新,这也是观察者更新进行管理的原因之一。
代理模式请参看:
http://blog.csdn.net/qq_27489007/article/details/53426428
命令模式,在.net,java平台的事件机制用的非常多,几乎每天都与之打交道。
android中对我印象最深的就是多线程多进程的环境,所以必然大量使用到Runbable,Thread,其实用的就是最简单的命令模式。
命令模式,Command Pattern,把请求封装为一个对象,多么巧妙的一个说法啊。
1.意图
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。
热门词汇:动作 事物 请求封装 排队 打包 异步
2.结构
Command接口提供了Execute方法,客户端通过Invoker调用命令操作来调用Recriver,绕了一大圈,
但是却把具体对Receiver的操作请求封装在具体的命令中,是客户端对recriver的操作清晰简明。
但是在实际项目中,我们常常忽略Receiver,而把命令对象的目标对象直接设置为子类自己的成员变
量或者作为execute()方法的临时变量。
以Android中的Runnable(在java.lang包下)为例,我们画出UML结构图如下:
想不到我们天天写的代码无意识中就是用到了命令模式,所谓模式,就是无所不在。
3.代码
命令接口Runnable定义如下:
public interface Runnable {
public abstract void run();
}
调用者Thread简化版代码:
//命令模式这里不需要继承Runnable接口,但是这里考虑到实际情况,比如方便性等,继承了Runnable接口,实现了run方法,这个是Thread自身的运行run的方法
class Thread implements Runnable {
private Runnable target;
public Thread(Runnable target) {
this.target = target;
}
public synchronized void start() {
if (threadStatus != 0 || this != me)
throw new IllegalThreadStateException();
group.add(this);
start0();//这个是本地方法,调用run方法
if (stopBeforeStart) {
stop0(throwableFromStop);
}
}
//可选
public void run() {
if (target != null) {
最后
我这里整理了一份完整的学习思维以及Android开发知识大全PDF。
当然实践出真知,即使有了学习线路也要注重实践,学习过的内容只有结合实操才算是真正的掌握。
参考docs.qq.com/doc/DSkNLaERkbnFoS0ZF
d(this);
start0();//这个是本地方法,调用run方法
if (stopBeforeStart) {
stop0(throwableFromStop);
}
}
//可选
public void run() {
if (target != null) {
最后
我这里整理了一份完整的学习思维以及Android开发知识大全PDF。
[外链图片转存中…(img-xTFgImxy-1724145598747)]
当然实践出真知,即使有了学习线路也要注重实践,学习过的内容只有结合实操才算是真正的掌握。
参考docs.qq.com/doc/DSkNLaERkbnFoS0ZF