一个事件通知工具类

285 阅读2分钟

做了几年android开发,自己并没有写出来什么拿的出手的东西,但是看了掘金大佬的

开源一个自用的Android事件分发中心库,实现类似系统广播功能

文章以后,发现我手里的东西好像有异曲同工之妙。现在把它分享出来,这东西可能不够好,或者比较烂,但是在开发中,确实能解决我感觉的一些痛点,希望各位能给我指出不足。

问题来自于哪里?

在android开发中,一些跨 activity、fragment的一些数据传递,事件通知往往比较蛋疼,网上也有很多很多的方式,最初因为一些环境或者自身的原因我并没有去接触到,也没有学习并且使用,后来自己慢慢琢磨出来一个小工具,现在把它分享出来。我给他命名:

FreeSync

/**
 * @author songdehuai
 */
public class FreeSync {

    /**
     * 默认本类名存储key,自定义key避免使用此名称
     */
    private static final String DEFAULTFREESYNCNAME = "FREESYNC_DEFAULTFREESYNCNAME";

    private ConcurrentHashMap<String, CopyOnWriteArrayList<FreeSyncCallback>> freeSyncCallbackHashMap = new ConcurrentHashMap<>();
    private static ConcurrentHashMap<String, FreeSync> freeSyncArrayMap = new ConcurrentHashMap<>();
    private static FreeSync freeSync = new FreeSync();

    private FreeSync() {

    }

    public static FreeSync defaultFreeSync() {
        freeSyncArrayMap.put(DEFAULTFREESYNCNAME, freeSync);
        return freeSync;
    }

    public static FreeSync freeSyncWithName(String name) {
        if (freeSyncArrayMap.containsKey(name)) {
            return freeSyncArrayMap.get(name);
        } else {
            freeSyncArrayMap.put(name, new FreeSync());
            return freeSyncArrayMap.get(name);
        }
    }

    public synchronized void addCall(String name, FreeSyncCallback freeSyncCallback) {
        boolean isHas = false;
        for (String s : freeSyncCallbackHashMap.keySet()) {
            if (name.equals(s)) {
                freeSyncCallbackHashMap.get(s).add(freeSyncCallback);
                isHas = true;
            }
        }
        if (!isHas) {
            CopyOnWriteArrayList<FreeSyncCallback> callBackList = new CopyOnWriteArrayList<>();
            callBackList.add(freeSyncCallback);
            freeSyncCallbackHashMap.put(name, callBackList);
        }
    }

    public synchronized void addCallOnly(String name, FreeSyncCallback freeSyncCallback) {
        for (String s : freeSyncCallbackHashMap.keySet()) {
            if (name.equals(s)) {
                freeSyncCallbackHashMap.remove(s);
            }
        }
        CopyOnWriteArrayList<FreeSyncCallback> callBackList = new CopyOnWriteArrayList<>();
        callBackList.add(freeSyncCallback);
        freeSyncCallbackHashMap.put(name, callBackList);

    }


    public synchronized void call(String name, Object obj) {
        CopyOnWriteArrayList<FreeSyncCallback> callBackList;
        for (String s : freeSyncCallbackHashMap.keySet()) {
            if (name.equals(s)) {
                callBackList = freeSyncCallbackHashMap.get(s);
                for (int i = 0; i < callBackList.size(); i++) {
                    callBackList.get(i).onCallBack(name, obj);
                }
            }
        }
    }
 
 
    public synchronized void call(String name) {
        CopyOnWriteArrayList<FreeSyncCallback> callBackList;
        for (String s : freeSyncCallbackHashMap.keySet()) {
            if (name.equals(s)) {
                callBackList = freeSyncCallbackHashMap.get(s);
                for (int i = 0; i < callBackList.size(); i++) {
                    callBackList.get(i).onCallBack(name, "");
                }
            }
        }
    }

    public synchronized void removeCall(String name) {
        for (String s : freeSyncCallbackHashMap.keySet()) {
            if (name.equals(s)) {
                freeSyncCallbackHashMap.remove(name);
            }
        }
    }

    public synchronized void removeFreeSync(String name) {
        for (String s : freeSyncArrayMap.keySet()) {
            if (name.equals(s)) {
                freeSyncArrayMap.remove(name);
            }
        }
    }

    public synchronized void clearAllDefault() {
        freeSyncCallbackHashMap.clear();
    }

    public synchronized void clearAllWithName(String name) {
        FreeSync freeSync = freeSyncWithName(name);
        if (freeSync != null) {
            freeSync.freeSyncCallbackHashMap.clear();
        }
    }

    public interface FreeSyncCallback {

        void onCallBack(String name, Object obj);
    }
}

这就是全部代码了,只有一个类,短短100行上下,下面了来看看怎么使用它

就是这么简单,它可用用在跨activity、fragment,或者任何一个地方。

freesync还提供了一种类似频道的概念,你可以为不同的业务、获取不同的频道

val freeSync = FreeSync.freeSyncWithName("test")

这样即可创建一个频道为 test 的freesync对象,只有再此频道内的事件才会被通知。

最后,如果你觉得freeSync有哪里不足的,我写的哪里不好的,感谢指出。