组件化代替EventBus的通信

本文介绍了一种基于JDK原生观察者模式的组件化通信方案。通过简单的代码实现,使得不同组件间能够有效地进行通信而无需持有对方引用,提高了系统的解耦与灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于组件化的通信,不能再持有对方的引用了。

前面写了一个ui通信工具,从实际工作中进行考虑,改造了下,封装了jdk的原生观察者模式。

直接上代码:


import android.os.Bundle;
import android.os.SystemClock;

import java.util.HashMap;
import java.util.Observable;
import java.util.Observer;

public class EventMng {

    public static void main(String args[]) {
        EventMng.registObserver(new EventObserver("play") {
            @Override
            public void onNotify(Bundle data) {
                System.out.println("通知数据:" + data);
            }
        });


        Bundle bundle = new Bundle();
        bundle.putString("key", "first blood");
        EventMng.notify("play", bundle);
    }


    private EventMng() {
    }


    private static HashMap<String, Event> eventHashMap = new HashMap<>();


    /**
     * 观察者观察某类事件,该类事件统称事件A,对应一个事件源eventA
     *
     * @param o
     */
    public static void registObserver(EventObserver o) {
        String name = o.getmEventName();

        if (eventHashMap.containsKey(name)) {
            eventHashMap.get(name).addObserver(o);
            return;
        }

        Event event = new Event();
        event.addObserver(o);

        eventHashMap.put(name, event);
    }


    public static void unRegitst(String eventName) {

        if (eventHashMap.containsKey(eventName)) {
            eventHashMap.get(eventName).deleteObservers();
        }
    }

    public static void unRegitstAll() {

        for (Event e : eventHashMap.values()) {
            e.deleteObservers();
        }
    }


    public static void notify(String eventName, Bundle data) {
        Event event = eventHashMap.get(eventName);
        if (event == null) {
            return;
        }
        data = data == null ? new Bundle() : data;
        event.onEvent(data);
    }


    private static class Event extends Observable {


        final long[] mHits = new long[2];

        private Bundle data;
        private long time = 16;//ms

        private void onEvent(Bundle data) {

            System.arraycopy(mHits, 1, mHits, 0, mHits.length - 1);
            mHits[mHits.length - 1] = SystemClock.uptimeMillis();
            if (mHits[0] >= SystemClock.uptimeMillis() - time) {
                return;
            }

            this.data = data;
            setChanged();
            notifyObservers();

        }

        Bundle getData() {
            return data;
        }
    }


    public static abstract class EventObserver implements Observer {

        private String mEventName;//绑定的事件名

        String getmEventName() {
            return mEventName;
        }

        public EventObserver(String mEventName) {
            this.mEventName = mEventName;
        }

        public abstract void onNotify(Bundle data);

        @Override
        public void update(Observable o, Object arg) {
            onNotify(((Event) o).getData());
        }
    }
}

非常简洁紧凑,使用也非常方便。

主要思路就是每一个事件源对应一个业务中的某类事件(比如命名为play),那么就用play来注册代表观察者对象关注这类事件。

在需要触发该业务的地方,以该命名为标记通知该类事件要触发了,该类的关注者会自动的接受到变化信息,并接受到相应数据。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值