1. 程式人生 > >android 頁面訊息傳遞,觀察者模式處理,打造純粹的訊息傳遞。

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