Android Observable详解

转至:http://blog.csdn.net/huangbiao86/article/details/7070645


对于观察者模式还是第一次接触,今天在上网看了些资料了解了一下,大意了解了……

定义:“定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变的时候,所有依赖于它的对象都将得到通知,并自动更新”,这就是所谓的观察者模式,照意思理解那么就一定会有观察者和被观察者了,在Java1.2之后,提供了两个类,即Observable被观察者,Observer观察者;

在Android中也提供了一个类Observable用于观察者模式,下面看看Observable 的源码便可以大意理解了。

  1. /* 
  2.  * Copyright (C) 2007 The Android Open Source Project 
  3.  * 
  4.  * Licensed under the Apache License, Version 2.0 (the "License"); 
  5.  * you may not use this file except in compliance with the License. 
  6.  * You may obtain a copy of the License at 
  7.  * 
  8.  *      http://www.apache.org/licenses/LICENSE-2.0 
  9.  * 
  10.  * Unless required by applicable law or agreed to in writing, software 
  11.  * distributed under the License is distributed on an "AS IS" BASIS, 
  12.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
  13.  * See the License for the specific language governing permissions and 
  14.  * limitations under the License. 
  15.  */  
  16.   
  17. package android.database;  
  18.   
  19. import java.util.ArrayList;  
  20.   
  21. /** 
  22.  * Provides methods for (un)registering arbitrary observers in an ArrayList. 
  23.  */  
  24. public abstract class Observable<T> {  
  25.     /** 
  26.      * The list of observers.  An observer can be in the list at most 
  27.      * once and will never be null. 
  28.      */  
  29.     protected final ArrayList<T> mObservers = new ArrayList<T>();  
  30.   
  31.     /** 
  32.      * Adds an observer to the list. The observer cannot be null and it must not already 
  33.      * be registered. 
  34.      * @param observer the observer to register 
  35.      * @throws IllegalArgumentException the observer is null 
  36.      * @throws IllegalStateException the observer is already registered 
  37.      */  
  38.     public void registerObserver(T observer) {  
  39.         if (observer == null) {  
  40.             throw new IllegalArgumentException("The observer is null.");  
  41.         }  
  42.         synchronized(mObservers) {  
  43.             if (mObservers.contains(observer)) {  
  44.                 throw new IllegalStateException("Observer " + observer + " is already registered.");  
  45.             }  
  46.             mObservers.add(observer);  
  47.         }  
  48.     }  
  49.   
  50.     /** 
  51.      * Removes a previously registered observer. The observer must not be null and it 
  52.      * must already have been registered. 
  53.      * @param observer the observer to unregister 
  54.      * @throws IllegalArgumentException the observer is null 
  55.      * @throws IllegalStateException the observer is not yet registered 
  56.      */  
  57.     public void unregisterObserver(T observer) {  
  58.         if (observer == null) {  
  59.             throw new IllegalArgumentException("The observer is null.");  
  60.         }  
  61.         synchronized(mObservers) {  
  62.             int index = mObservers.indexOf(observer);  
  63.             if (index == -1) {  
  64.                 throw new IllegalStateException("Observer " + observer + " was not registered.");  
  65.             }  
  66.             mObservers.remove(index);  
  67.         }  
  68.     }  
  69.       
  70.     /** 
  71.      * Remove all registered observer 
  72.      */  
  73.     public void unregisterAll() {  
  74.         synchronized(mObservers) {  
  75.             mObservers.clear();  
  76.         }          
  77.     }  
  78. }  

当然这个类只是抽象类,如果我们需要用的话,还需要继承 这个类,这有一个方法,通知被观察者进行更新。


观察者模式是软体设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。

实现过程:“注册——通知——撤销注册”

1、观察者

(Observer)将自己注册到被观察对象(Subject)中,被观察对象将观察者存放在一个容器(Container)里。

2、被观察对象

被观察对象发生了某种变化,从容器中得到所有注册过的观察者,将变化通知观察者。


在Android中最常用的应用:


在ListView中Adapter中favoritesAdapter.registerDataSetObserver(mDataSetObserver);;数据改变之后会自动调用:

mDataSetObserver里面的方法;如:

  1. DataSetObserver mDataSetObserver = new DataSetObserver() {  
  2.   
  3.         @Override  
  4.         public void onChanged() {  
  5.             if (favoritesAdapter.getCount() <= 0) {  
  6.                 showNoDeviceHint();  
  7.             } else {  
  8.                 hiddenNoDeviceHint();  
  9.             }  
  10.             loadingImageButton.setVisibility(View.GONE);  
  11.             super.onChanged();  
  12.         }  
  13.   
  14.         @Override  
  15.         public void onInvalidated() {  
  16.             super.onInvalidated();  
  17.         }  
  18.   
  19.     }; 

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值