观察者模式(Observer)在Android中的应用:
16lz
2021-01-25
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(); } }
经过以上步骤,就设计完成了观察者模式。
更多相关文章
- Android(安卓)RxJava操作符详解系列: 变换操作符
- Android(安卓)BLE最完整的工具类(扫描/连接/读写/通知设备)
- Android开发者福利之--------Android(安卓)5.0 API
- 初识Android的ReactiveX
- Android(安卓)RxJava/RxAndroid结合Retrofit使用
- [置顶] Android短信息验证码自动填写详细介绍
- Android(安卓)4.1的新特性介绍
- Android(安卓)实现本地更新并在更新完成后打开
- 详解极光推送的 4 种消息形式—— Android(安卓)篇