Android Observe
代码解释很全面,复制到IDE中,可以更方便查看如何使用的
包含观察者,被观察者以及使用者
祝君早日掌握
本来想改一下这样的写法的,但想来想去还是这样好,最原始的的observer用法
package observe;import java.util.Observable;
import java.util.Observer;//TODO 总体流程:先执行具体类中的——————引用自observer的抽象change方法,
// 在执行observer中的update方法,
// 最后执行Observable中的具体设计接口,
// 被观察者通知观察者的循序是遵循“先订阅loginOutObservable.addObserver(loginoutObserver1);
// loginOutObservable.addObserver(loginoutObserver3);
// loginOutObservable.addObserver(loginoutObserver2);
// 后通知 loginOutObservable.setLoginOut(true);”的循序,//TODO 总结:1、观察者//(Observer)将自己注册到被观察对象(Subject)中,被观察对象将观察者存放在一个容器(Container)里。////2、被观察对象//被观察对象发生了某种变化,从容器中得到所有注册过的观察者,将变化通知观察者。
public class observer {//TODO 总体说明:// Android中的观察者需要实现Observer接口,当数据发生改变时,观察者的update()方法就会被调用,被观察者继承Observable类,// 在数据发生改变时,需要调用setChanged(); this.notifyObservers(obj);这两个方法才可以通知观察者,//TODO 被观察者public abstract class LoginOutObservable extends Observable {private String userName = "admin";/*** 设置是否登出,如果是,则需要通知观察者** @param isLoginOut isLoginOut*/public void setLoginOut(boolean isLoginOut) {if (isLoginOut) {String data = "被观察者告诉你:你已经退出登录,请重新登录!";/* 注意注意注意:下面这两个方法是要同时调用的,否则不会通知观察者数据发生了变化 */setChanged();this.notifyObservers(data);onUserLoginOut("这是在被观察者内部调用的方法:" + data);}}/*** 设置用户名,如果用户名和上次的不一样,则需要通知观察者** @param name name*/public void setUserName(String name) {if (!name.equals(userName)) {this.userName = name;String data = "被观察者告诉你:用户名已经改变了!新的名字为:" + name;/* 注意注意注意:下面这两个方法是要同时调用的,否则不会通知观察者数据发生了变化 */setChanged();this.notifyObservers(data);//TODO 执行完所有订阅之后才去执行onUserNameChanged("这是在被观察者内部调用的方法:" + data);}}/*** 当用户名字发生改变时,用于在本类中将数据打印出来* <p>* 感悟:* 抽象方法,凡是继承此类的子类,都需要重写此方法* 但是我们可以再本类里调用此方法,然后实例化此类的时候,要求实现类实现本类里头的抽象方法** @param newUserName*/public abstract void onUserNameChanged(String newUserName);/*** 当用户登出时,在本类中用于将数据打印出来* <p>* 感悟:* 抽象方法,凡是继承此类的子类,都需要重写此方法* 但是我们可以再本类里调用此方法,然后实例化此类的时候,要求实现类实现本类里头的抽象方法** @param message message*/public abstract void onUserLoginOut(String message);}//TODO 观察者public abstract class LoginoutObserver implements Observer {@Overridepublic void update(Observable o, Object arg) {/* 当被观察者因为数据发生了改变,并通知了相关的观察者后,观察者将会调用此方法进行相应* 我们这里调用的是本地的抽象方法进行数据输出 */onDataChanged("观察者从被观察者中的消息:", arg);}/*** 这里给出一个抽象方法给实现类实现,然后我们会在updat()方法被调用的时候,调用这个方法,给实现类相应** @param message message* @param object object*/public abstract void onDataChanged(String message, Object object);}public void observerTest() {/* 被观察者:登出/修改用户名类,实例 */LoginOutObservable loginOutObservable = new LoginOutObservable() {@Overridepublic void onUserNameChanged(String newUserName) {printer(newUserName);}@Overridepublic void onUserLoginOut(String message) {printer(message);}};/*观察者1:并实现了观察者类的抽象方法,实现在这里进行数据的打印输出 */LoginoutObserver loginoutObserver1 = new LoginoutObserver() {@Overridepublic void onDataChanged(String message, Object object) {printer("我是观察者1-->" + message + "," + object.toString());}};/*观察者2:并实现了观察者类的抽象方法,实现在这里进行数据的打印输出 */LoginoutObserver loginoutObserver2 = new LoginoutObserver() {@Overridepublic void onDataChanged(String message, Object object) {printer("我是观察者2-->message:" + message + "," + object.toString());}};LoginoutObserver loginoutObserver3 = new LoginoutObserver() {@Overridepublic void onDataChanged(String message, Object object) {printer("我是观察者3-->message:" + message + "," + object.toString());}};/*** 这里像是被观察者订阅了观察者,看起来是有点别扭的哈;* 就像和反射里面调用invoke方法:method.invoke(obj, args);* 具体可以参考这篇文章:* 但是不要被混淆了,最好记的一点就是:外国人说话看起来都是和中文"反过来"的*/loginOutObservable.addObserver(loginoutObserver1);loginOutObservable.addObserver(loginoutObserver3);loginOutObservable.addObserver(loginoutObserver2);/* 这里是模拟被观察者登出操作,登出了必须要通知用户重新登录啊 */loginOutObservable.setLoginOut(true);/* 这里是模拟被观察者修改了用户名操作,导致前后用户名不一致而引起数据变化了 */loginOutObservable.setUserName("tanksu");}public void printer(String content) {System.out.println(content);}
}
Android Observe相关推荐
- linux的android工作室,Android工作室在启动时抛出错误,linux机器
我只是将我的Android Studio从1.5升级到2.3,我只是解压缩文件夹并复制到下载文件夹中,现在当我启动android studio时,我收到了此消息:Android工作室在启动时抛出错误, ...
- 结合Android去水印APP谈谈分区存储
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 前言 方便个人更新微信状态,上周花半天时间编写简单的抖音去水印AP ...
- android 子module混淆_Android 传统(经典)蓝牙框架
功能 支持多设备同时连接 支持观察者监听或回调方式.注意:观察者监听和回调只能取其一! 支持使用注解@RunOn控制回调线程 支持设置回调或观察者的方法默认执行线程 配置 因为使用了jdk8的一些特性 ...
- android组件浮动在activity上_Jetpack Hilt 依赖注入框架上手指南
code小生 一个专注大前端领域的技术平台公众号回复Android加入安卓技术群 作者:LvKang-insist 链接:https://juejin.im/post/5efdff9d6fb9a07e ...
- Android Jetpack架构组件之 Room(使用、源码篇)
2019独角兽企业重金招聘Python工程师标准>>> 1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发 ...
- Android MVVM 架构应用实现
以前项目中虽然也使用MVVM架构,但由于整体框架不是我自己搭建的,导致我对于MVVM架构的整体还是很不熟悉,所以这次就自己搭建并实现一次MVVM架构. MVVM架构使用的组件有ViewModel.Li ...
- android DataBind LiveData ViewModel 使用详解
1.导入android x ,升级 版本到28 implementation 'androidx.appcompat:appcompat:1.0.0'def room_version = " ...
- Android Jetpack组件之WorkManger使用介绍
1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...
- Android Jetpack组件之 Room使用-源码
1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...
最新文章
- 使用自定义色系美化JfreeChart图表
- 预印本平台(arXiv.org) — 免费论文库,开心学习吧~~~
- CodeForces - 760E Nikita and stack
- 如何用c 语言编写阶乘程序,求10000的阶乘(c语言代码实现)
- Django中object.all
- python学习之路(10)--难点
- 利用composer搭建PHP框架(四.数据库与缓存)
- MySQL索引的使用及注意事项
- [BZOJ 1799] self 同类分布
- 洛谷 P3152 正整数序列
- 关于unity商店里的隐藏组件
- android使用线程计时器,计时器的Android线程
- 怎么用计算机画外观设计图片,以实例教你如何绘制外观设计专利3D线条图
- qt有关tcpserver中读取数据时是否使用flush时的研究
- 连肝7个晚上,总结了计算机网络的知识点!(共66条)
- 摩尔纹的原理与产生条件
- Contiki介绍及参考资料
- 怎么看自己mysql的账号密码是多少_怎么查到mysql的账号密码是什么?
- 【linux】循序渐进学运维-基础篇-mount
- 大规模敏捷导入工具实践
热门文章
- GTX 1650桌面显卡、GTX 1660 Ti/GTX 1650笔记本显卡发布之后,NVIDIA同步放出了430.39版驱动程序...
- 怎么才能高效的打开dwg文件呢?CAD小白有什么简单的方法?
- 《中国式家长》v1.0.3.7女儿版 附带修改器
- 一个LED的N种玩法--多线程
- VB写的红警内存辅助-反汇编无限金币
- 一个刚毕业前端的年度总结
- MySQL创建只读用户
- 英文期刊催稿信模板_SCI 投稿全过程信件模板一览(Cover letter,催稿信等)
- 用机器学习预测,手持98k化身吃鸡大师
- 国外基础几何算法答与问