现实的开发过程中大家都会用到很多页面与页面之间的消息传递,方法有很多,观察者模式,EventBus,广播,intent,很多很多种方式可以实现。今天我要提一提利用观察者模式进行页面之间的消息传递与接收。
首先定义一个用于通知消息的接口,ObserverListener
/**
* 观察者接口
* Created by Home-Pc on 2017/4/25.
*/
public interface ObserverListener {
public void observerUpData(String msgKey, Object object);
}
msgKey 用于定义该条message 对应的key 用于接收时 判断key进行接收。object则为消息传递时 需要传递的数据。
定义一个需要被监听的接口,其中有添加、更新、删除等功能。对应的
/**
* 被观察者接口
* Created by Home-Pc on 2017/4/25.
*/
public interface SubjectListener {
/**
* 添加
*/
public void addObserver(String msgKey, ObserverListener observerListener);
/**
* 更新
*/
public void sendObserver(String msgKey, Object content);
/**
* 删除
*/
public void remove(String msgKey);
}
最后是观察者模式的管理类。用于处理消息的各种监听动作。
/**
* 观察者管理类
* Created by Home-Pc on 2017/4/25.
*/
public class ObserverManager implements SubjectListener {
private static ObserverManager instance;
private Map<String, ObserverListener> observerMap = new HashMap<>();
public static ObserverManager getInstance() {
if (null == instance) {
synchronized (ObserverManager.class) {
if (null == instance) {
instance = new ObserverManager();
}
}
}
return instance;
}
/**
* 加入监听队列
*/
@Override
public void addObserver(String msgKey, ObserverListener observerListener) {
observerMap.put(msgKey, observerListener);
}
/**
* 通知观察者刷新数据
*/
@Override
public void sendObserver(String msgKey, Object content) {
for (Map.Entry<String, ObserverListener> entry : observerMap.entrySet()) {
if (entry.getKey().equals(msgKey)) {
entry.getValue().observerUpData(msgKey, content);
}
}
}
/**
* 监听队列中移除
*/
@Override
public void remove(String msgKey) {
if (observerMap.containsKey(msgKey)) {
observerMap.remove(msgKey);
}
}
/**
* 清空监听队列
*/
public void clearObserver() {
if (observerMap == null || observerMap.size() == 0) {
return;
}
observerMap.clear();
}
}
页面的调用也十分方便,在actvity或fragment 的基类中 实现ObserverListener 接口。
以下是我的base类中实现的代码。
/********************************************* 关于消息 *********************************************/
protected List<String> msgKeyList = new ArrayList<>();
protected void observeMessage(String msgKey) {
msgKeyList.add(msgKey);
ObserverManager.getInstance().addObserver(msgKey, this);
}
protected void onReceiveMessage(String msgKey, Object msgObject) {
}
protected void sendMessage(String msgKey, Object msgObject) {
ObserverManager.getInstance().sendObserver(msgKey, msgObject);
}
protected void removeMessage(String msgKey) {
ObserverManager.getInstance().remove(msgKey);
}
@Override
public void observerUpData(String msgKey, Object object) {
onReceiveMessage(msgKey, object);
}
注意:销毁页面时销毁已经存在的msgKey
@Override
public void onDestroy() {
if (msgKeyList != null && msgKeyList.size() != 0) {
for (int i = 0; i < msgKeyList.size(); i++) {
removeMessage(msgKeyList.get(i));
}
}
super.onDestroy();
}
写这篇文章的目的是我对于eventBus 的监听与接收对于一个新手的可能造成的困惑而写。我感觉总体而言 观察者模式 作为一个纯粹的消息传递有着近乎原生的快速简洁。以上就是我对于页面之间的消息传递的一点领悟,不喜勿喷,欢迎大家提出更多意见。