JeremyLiao / LiveEventBus

:mailbox_with_mail:EventBus for Android,消息总线,基于LiveData,具有生命周期感知能力,支持Sticky,支持AndroidX,支持跨进程,支持跨APP
Apache License 2.0
3.83k stars 515 forks source link

对于事件监听代码写法的一点建议 #142

Open edwardZj opened 2 years ago

edwardZj commented 2 years ago

一直想抽空给你提交个pull request,想想还是提个建议好了,哈哈哈 就是对于多事件监听,写法比较不够优雅,如下(因为项目中大量的使用事件分发来解耦,所以在一些地方要监听多个事件的场景很多) LiveEventBus .get("some_key1", String.class) .observe(this, new Observer() { @Override public void onChanged(@Nullable String s) { } }); LiveEventBus .get("some_key2", String.class) .observe(this, new Observer() { @Override public void onChanged(@Nullable String s) { } }); .............. 我对LiveEventBus做了一些二次封装,包括之前的try catch事件,延迟发送等等,对于多事件监听,我是用注解来解决这个问题的,我的写法如下: DanmuPoster.observe((LifecycleOwner) getContext(), new EventObserver() { @EventObserve({OperationCode.FANS_CARD_JOIN, OperationCode.RECEIVE_GIFT, OperationCode.FANS_CARD_UPGRADE}) @Override public void onReceive(String op, Object obj) { switch (op) { case OperationCode.RECEIVE_GIFT: xxxxxxxx break; case OperationCode.FANS_CARD_JOIN: xxxxxxxx break; case OperationCode.FANS_CARD_UPGRADE: xxxxxxxx break; default: break; }

        }
    });

DanmuPoster是我基于LiveEventBus封装的,observe方法里面,基于反射读取了EventObserver的onReceive方法的注解,然后分别建立observer监听(当然这种方式肯定只能基于object接收),observeSticky等同理 Method method = observe.getClass().getDeclaredMethod("onReceive", String.class, Object.class); EventObserve anno = method.getAnnotation(EventObserve.class); if (anno != null) { String[] value = anno.value(); for (String eventName : value) { observe(owner, eventName, observe); } } 这样监听事件的代码都能集合到一块,看起来清晰一些紧凑一些,发送的代码不变.当然,我懒了点,最好还是用注解处理器在编译期处理分别建立observer监听 我还有另外的建议放到别的issue里

edwardZj commented 2 years ago

其实也不用非得注解,也可以用参数来传, observe的时候传一个String数组,或者 new EventObserver() { // public String[] getEvents(){ return new String[]{event1,event2,event3}; } }

JeremyLiao commented 2 years ago

写得挺好,容我消化消化:)