搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
我家自动化
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
SpringBoot+Vue打包为war,以及在Tomcat部署后,页面访问不到静态资源_springboot前后端项目打成war包页面位置有问题
2
python列表换行写入txt_关于文件写入后自动换行的问题
3
Python3.8新特性_python 3.8
4
基于 OpenVINO™ 的AI Agent— Samantha(萨曼莎)
5
Android studio毕设制作液体动画Animation(毕业设计2048小游戏)_def githubproperties = new properties() githubprop
6
纯HTML+CSS+JS制作音乐播放器(附源码)_音乐播放器页面代码
7
2022年第五空间网络安全大赛WriteUp
8
用MacBook实操:docker本地部署mysql+php+nginx坏境_mac docker php
9
还不知道Android Jetpack是什么?你就out了_jetpack支持19么
10
uniapp微信小程序下载保存图片流到本地,base64_小程序如何保存base64图片
当前位置:
article
> 正文
Android Observer观察者模式_安卓observe()
作者:我家自动化 | 2024-03-22 07:38:55
赞
踩
安卓observe()
Android
Observer
观察者模式,就是java那一套观察者模式。今天就来介绍下这个模式的使用方法,其实在Android中很多内容都用到了这个模式,比如说BaseAdapter AbsListView View等都有,只是名字各有不同。
首先
我们先要知道,
观察者
模式中主要有
观察者
和
被观察者
2个对象,而在观察模式中Observable表示
被观察者
,由于这个对象是一个抽象类
只能被继承
。而Observer表示
观察者
,它并不是一个类而
是一个接口
,所以观察者可以有多个,实现了该接口的类都属于观察者。 当然有人会问既然被观察者是一个抽象类而观察者是一个接口,那么是否有一个类即继承Observable类又实现Observer接口呢,这个自然可以,观察者当然也可以同时是被观察者,被观察者同样可以是观察者,在这里完全不冲突。
被观察者(
Observable
)与观察者(
Observer
)
当某一个我们需要被观察的对象继承自Observable类时,就表示该类可以被很多
观察者
(实现了Observer)
观察,其实意思就是说这个对象也就是
被观察者
“上电视了”,电视前的你也就是
观察者
可以看,(对象发生变化)电视里
被观察者
做了别的动作,那么电视前的所有人看到的也就变了,在同一时间改变所有观众看到的画面。
那么现在有了几个问题:
问题一:既然继承自Observable的类都是
被观察者
(相当于一个电视频道),而
实现了Observer的都是
观察者
(电视前的观众),那“电视台”怎么知道有哪些“观众”在看它这个台呢,也就是这个
被观察者
被多少个
观察者
观察着呢?
问题二:虽然电视机可以直接通过不断的发送信号来改变观众面前电视机的画面,可是代码是怎么实现
观察者
观察的
被观察者
发生了变化了让自己得到的数据也跟着变化的呢?
例如:MyPerson是被观察者:
[mw_shl_code=java,true]public class MyPerson extends Observable {
private int age;
private String name;
private String sax;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
setChanged();
notifyObservers();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
setChanged();
notifyObservers();
}
public String getSax() {
return sax;
}
public void setSax(String sax) {
this.sax = sax;
}
@Override
public String toString() {
return "MyPerson [age=" + age + ", name=" + name + ", sax=" + sax + "]";
}
}[/mw_shl_code]
注意到:setChanged();notifyObservers();多了这两句调用,而这里就是解决问题二所在,它通过setChanged();告知数据改变,通过notifyObservers();发送信号通知观察者。
MyObserver是观察者:
[mw_shl_code=java,true]public class MyObserver implements Observer {
private int i;
private MyPerson myPerson;//观察的对象
public MyObserver(int i){
System.out.println("我是观察者---->" + i);
this.i = i;
}
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
public MyPerson getMyPerson() {
return myPerson;
}
public void setMyPerson(MyPerson myPerson) {
this.myPerson = myPerson;
}
@Override
public void update(Observable observable, Object data) {
System.out.println("观察者---->"+ i +"得到更新!");
this.myPerson = (MyPerson)observable;
System.out.println(((MyPerson)observable).toString());
}
}[/mw_shl_code]
这里我们看到,实现了Observer,只有一个update方法,那么这个方法什么时候被调用呢,很显然,在上面我们有通知的信号,那么这里就是接受到信号后执行的动作。
MainActivity主函数:
[mw_shl_code=java,true]public class MainActivity extends ListActivity {
private Button add;
private MyPerson observable;
private int i = 1;
private Button change;
private ListView lv;
private List<MyObserver> myObservers;
private Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
// 将信息加入list中显示
MyListAdapter myListAdapter = new MyListAdapter(MainActivity.this, myObservers);
lv.setAdapter(myListAdapter);
return false;
}
});
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
add = (Button) findViewById(R.id.add);
observable = new MyPerson();
myObservers = new ArrayList<MyObserver>();
lv = getListView();
//添加观察者
add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyObserver myObserver = new MyObserver(i);
i++;
observable.addObserver(myObserver);
myObservers.add(myObserver);
handler.sendEmptyMessage(0);
}
});
change = (Button) findViewById(R.id.change);
//通知数据改变
change.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
observable.setAge(10 + i);
observable.setName("a" + i);
observable.setSax("男" + i);
handler.sendEmptyMessage(0);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}[/mw_shl_code]
add这个button是用来添加观察者的,而我们看到myObservers.add(myObserver);这样一句,那么这里就是解决问题一所在了,它的意思就是为
被观察者
添加
观察者
的。change这个button用来改变数据用于测试。
最后,看戏实例的效果图:
当第一次点击(点击5次增加5个)“添加观察者”: 第一次点击“改变数据”:
当第二次点击(点击2次增加2个)“添加观察者”: 第二次点击“添加观察者”:
转载:
http://www.apkbus.com/android-112815-1-1.html
值得注意的是在android中mms的发送和接收,用到的就是观察者模式。其中Transaction继承了Observable,而Transaction的真正实现是SendTransaction。TransactionService实现了Observer.
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/我家自动化/article/detail/286315
推荐阅读
article
Android
无线调试(
Android
wireless
debugging
)_
android
wl...
adb通常都是通过USB连接来使用的。但是,你也可以通过WiFi来调试。下面是步骤: 1.首先保证你的
Android
设备...
赞
踩
article
Android
Studio
引用
第三方
库的方式_
android
studio
libs
...
Android
Studio
引用
第三方
库的方式_
android
studio
libs
android
studio
li...
赞
踩
article
Android
Studio
如何用无线(WiFi)连接手机进行调试_
android
studio
无线...
今天是2022年2月15日,农历正月十五。截止今日,我已经一年多没写代码了,去年干了一年铸造。今天无意间看到原来Andr...
赞
踩
article
Android
studio
报错Could not
find
method
dependencyRe...
新建一个项目
Android
studio
报错Could not
find
method
dependencyResolu...
赞
踩
article
android
studio
无线
wifi
调试手机
debug
免
数据线
_
android
studio
...
背景最近公司
数据线
紧缺,我的usb线被拔来拔去,今天居然罢工了,懒得去申请,突然想到以前看过无线
debug
调试,于是来研...
赞
踩
article
Android
Studio
Bumblebee
:支持通过WI-FI连接设备_enable adb...
Android
Studio
Bumblebee
:支持通过WI-FI连接设备 Pair devices over Wi...
赞
踩
article
Android
无线
调试
手机
(
WiFi
调试
)_无线
调试
手机
自身...
今天
调试
时
手机
没电了,USB 插在电脑上充电非常慢,因此想着试试无线
调试
,
手机
查找电源上快速充电。1、
手机
和电脑连接同一...
赞
踩
article
Compose -
Gradle
7.0+ 升级 8.0+ 问题处理_api
'
android
.re...
/ // 设置最大线程数使用,当运行dex-in-process时,默认为4。// // 对依赖的库进行dex 预处...
赞
踩
article
Android
Studio
Arctic
Fox | 2020.3.1、
Gradle
7.0升级记...
环境
Android
Studio
Arctic
Fox | 2020.3.1
Gradle
、AGP 7.0Kotlin 1...
赞
踩
article
Android
Studio中
Gradle
问题解决方法(亲测有效)_
android
studio
怎么...
当我们在新建或者导入一个项目时,会发现
Gradle
一直在编译,时间特别久。_
android
studio
怎么解决grad...
赞
踩
article
Android
Studio 升级到3.1.2问题小结_dsl
element
'
annotatio...
Android
studio冲2.1版本升到3.1.2遇到好多问题,在这里做一下简单的总结,希望同道中人有则改之、无则加...
赞
踩
article
Android
Studio--
pair
device
s
using
wifi
_
android
st...
pair
device
s
using
wifi
_
android
studio
pair
device
using
wif...
赞
踩
article
报错: The
option
sett
in
g
‘
android
.
enableR8
=
fals
e‘ is...
VR一体机app开发的啰嗦之处比较多,其中就包括开发环境的搭建。The
option
sett
in
g
'
android
....
赞
踩
article
set
android
.
defaultConfig
.
javaCompileOptions
.annot...
在集成lomBok butterknife时 用到注解build报如下错误 Error:FAILURE: Build f...
赞
踩
article
an
d
roi
d
错误合集1_
error
:
d
:\
an
d
roi
d
stu
d
io_2023_2024\a...
D:\
an
d
roi
d
shiyan24\app\
src
\
main
\res\layout\activity_
main
.xml...
赞
踩
article
Android
史上最全
gradle
升级
3.0+问题汇总(一)_dsl
element
'annot...
Android
Gradle3.0是一个大版本的
升级
,至于
升级
的好处,这里就不多说了。直接开干。
升级
步骤目前最新的gra...
赞
踩
article
the
+
android
+
gradle
,
升级
gradle
至
3.0
+
,
一路填坑...
8种机械键盘轴体对比本人程序员
,
要买一个写代码的键盘
,
请问红轴和茶轴怎么选?本人项目中的
gradle
版本比较低
,
为了不影...
赞
踩
article
Android
-常用
ADB
命令_
adb
pull
traces...
Android
-常用
ADB
命令
Android
-常用
ADB
命令开启
adb
服务和停止常规选择设备安装和卸载程序文件导入和...
赞
踩
article
Android
sdk
升级
爬坑记录_
android
sdk
怎么
升级
...
入职新公司,第一份任务是将几个项目的target
升级
到Pie(28)。以下是在
升级
过程中遇到,搜集,整理的一些问题,在此...
赞
踩
article
Gradle
-
Android
Plugin
DSL
_
android
插件
使用plugins ds...
Android
Plugin
DSL
Android
Plugin
DSL
就是 Google 为了开发
Android
...
赞
踩
相关标签
Androi无线调试
adb
wireless
debugging
android studio
android
ide
gradle
调试
android-studio
android jetpack
AGP
Arctic Fox
kotlin
butterknife
Annotation process
Android studio
compile implementation
升级3.0