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 的监听与接收对于一个新手的可能造成的困惑而写。我感觉总体而言 观察者模式 作为一个纯粹的消息传递有着近乎原生的快速简洁。以上就是我对于页面之间的消息传递的一点领悟,不喜勿喷,欢迎大家提出更多意见。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值