1.概念:Android中主要是指当某些敏感性数据eg:数据库和控件 发生变化的时候,发消息给对这些敏感数据感兴趣者,也即观察者,然后观察者用自己的业务逻辑处理。

2.应用举例: 比如银行账户改变,将消息发给用户,用户收到消息处理此事件。针对以上情况,观察者设计模式如下:

a. 模拟数据库,里面装载有许多敏感数据,对数据库中的数据进行操作,同时发消息通知所有观察者:

public class AccountDB {    // 此为数据库:实现增删查改的功能,同时数据库有改变的是否,及时发出变更的消息    private ArrayList<AccountInfo> list = new ArrayList<AccountInfo>();    private Context context;    public AccountDB(Context context) {        this.context = context;    }    // 往数据库中增加一个账户信息:    public void add(AccountInfo accountInfo) {        list.add(accountInfo);        // The uri of the content that was changed.        Uri uri = Uri.parse("content://account/add/" + accountInfo.id);        context.getContentResolver().notifyChange(uri, null);    }}

b.定义一个观察者类,重写Onchange方法:

class MyContentObserver extends ContentObserver {        public MyContentObserver(Handler handler) {            super(handler);        }        @Override        public void onChange(boolean selfChange, Uri uri) {            // 当有改变的时候,通知有数据在修改            long id = ContentUris.parseId(uri);            Toast toast = Toast.makeText(getApplicationContext(), "有在修改账户" , 0);            toast.setGravity(Gravity.CENTER, 0, 0);            toast.show();        }    }

c. activity中的业务逻辑:
注册和注销观察者,对数据库进行修改:

@Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_observer);        db = new AccountDB(getApplicationContext());        // 注册一个观察者:        Uri uri = Uri.parse("content://account/add");        observer = new MyContentObserver(new Handler());        getContentResolver().registerContentObserver(uri, true, observer);    }// 在destroy的时候取消注册观察者    @Override    protected void onDestroy() {        super.onDestroy();        getContentResolver().unregisterContentObserver(observer);    }public void addAccount(View view) {        // 当点击这个button的时候,应该创建出一个账户        AccountInfo info = new AccountInfo();        info.id = (int) System.currentTimeMillis();        info.accountName = "账户1" + info.id;        info.money = System.currentTimeMillis();        // 将账户增加到数据库中        db.add(info);    }

所以当我们点击button修改账户的时候,会有消息提示在改变账户:

3.Android中的BaseAdapter也是用到了观察者:
定义了一个类DataSetObservable extends Observable

当数据有变更的时候:就向观察者发消息:

 public void notifyDataSetChanged() {        mDataSetObservable.notifyChanged();    }

当数据不再有效的时候:也通知观察者:

 public void notifyDataSetInvalidated() {        mDataSetObservable.notifyInvalidated();    }

当ListView中有变更的时候,就会发消息告知:

    if (mAdapter != null && mDataSetObserver != null) {            mDataSetObserver.onChanged();        }

3.以下载管理为例:将其设计为观察者模式。其中下载管理 是被观察者:
思路分析:
a. 定义观察者接口:即关注哪些变化

public interface DownloadObserver{        //关注下载状态发生变化:        public void onDownloadStateChanged();        //关注下载进度发生变化:        public void onDownloadProgressChanged();    }

b. 注册观察者:

//观察者有可能有一大堆,所以用集合表示:private ArrayList<DownloadObserver> mDownloadObservers = new ArrayList<DownloadObserver>();public void registerDownloadObserver(DownloadObserver observer){        if(observer!=null && !mDownloadObservers.contains(observer)){            mDownloadObservers.add(observer);        }    }

c. 注销观察者:

public void unregisterDownloadObserver(DownloadObserver observer){        if(observer!=null && mDownloadObservers.contains(observer)){            mDownloadObservers.remove(observer);        }    }

d. 下载状态发生变化时,通知观察者:

public void notifyDownloadStateChanged(DownloadInfo info){        //遍历集合。每个都通知到:        for(DownloadObserver observer:mDownloadObservers){            observer.onDownloadStateChanged();        }    }

e.下载进度发发生变化时,通知观察者:

public void notifyDownloadProgressChanged(DownloadInfo info){        for(DownloadObserver observer:mDownloadObservers){            observer.onDownloadProgressChanged();        }    }

经过以上步骤,就设计完成了观察者模式。

更多相关文章

  1. Android(安卓)RxJava操作符详解系列: 变换操作符
  2. Android(安卓)BLE最完整的工具类(扫描/连接/读写/通知设备)
  3. Android开发者福利之--------Android(安卓)5.0 API
  4. 初识Android的ReactiveX
  5. Android(安卓)RxJava/RxAndroid结合Retrofit使用
  6. [置顶] Android短信息验证码自动填写详细介绍
  7. Android(安卓)4.1的新特性介绍
  8. Android(安卓)实现本地更新并在更新完成后打开
  9. 详解极光推送的 4 种消息形式—— Android(安卓)篇

随机推荐

  1. Android(安卓)DataBinding使用总结(二)
  2. ionic 发布 android apk
  3. Android的Window底层原理
  4. 颜色选择器【ColorPickerPreference】自
  5. 打开Android(安卓)C文件中的LOG
  6. Android(安卓)Service的两种启动方式,你知
  7. android 6.0及以上动态权限的获取
  8. Android应用程序结构及开发流程
  9. Android(安卓)自定义dialog(封装好的)
  10. ArcGis for Android(安卓)10.2.8个人整理