做了几年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有哪里不足的,我写的哪里不好的,感谢指出。