android 頁面訊息傳遞,觀察者模式處理,打造純粹的訊息傳遞。
現實的開發過程中大家都會用到很多頁面與頁面之間的訊息傳遞,方法有很多,觀察者模式,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 的監聽與接收對於一個新手的可能造成的困惑而寫。我感覺總體而言 觀察者模式 作為一個純粹的訊息傳遞有著近乎原生的快速簡潔。以上就是我對於頁面之間的訊息傳遞的一點領悟,不喜勿噴,歡迎大家提出更多意見。