Sloaix / Apollo

🚀 Awesome EventBus by RxJava.
https://lsxiao.github.io/Apollo/
Apache License 2.0
332 stars 36 forks source link

希望能添加权重 #2

Closed oksimple closed 8 years ago

oksimple commented 8 years ago

用 eventbus 有权重功能,感觉很好,比如多个tag接收同一事件,按照不同权重顺序接收。 还有 MAIN, IO, NEW, COMPUTATION, TRAMPOLINE, IMMEDIATE 这几个分别说明一下啊 ,是不是和eventbus 的一样呢

Sloaix commented 8 years ago

因为是RxJava和RxAndroid的线程调度器,所以没有说明,下次更新我会加以说明的。

你说的权重功能在event bus中是怎么使用的呢?能否给一段示例代码吗?

oksimple commented 8 years ago

@lsxiao 意思是能添加权重就好了,也就同tag下 能控制消息的优先级

Sloaix commented 8 years ago

@oksimple 但是消息的发送先后顺序,是不确定的,有可能是业务触发,有可能是用户人为触发。 那么接收到事件的先后顺序也就是不确定的,当事件到达所有的订阅者后就会被消费了(除非是sticky事件,否则不会被再次消费)。

我个人感觉在代码上无法实现你说的那种权重功能,或许是我没理解对。能问下权重的业务场景吗? :),如果是只有一个tag的话:

    @Receive(tag = TAG)
    public void showDialog(){
        //show dialog.
    }

那么消息是按照事件的发送顺序接收的。

oksimple commented 8 years ago

@lsxiao 我的意思是一对多的情况,比如 我发送一条tag消息出去,肯定对应了这条消息的tag的方法都会收到该消息,那么问题来了 谁先触发这条消息呢? 我看你sticky消息能够控制清除,那么普通消息 多个方法接收一条消息后 我想其中一个方法接收后 禁止 消息继续向下传递 又该咋搞啊

Sloaix commented 8 years ago

@oksimple 你这样说我就理解了,你说的是订阅者订阅同一tag事件后,接收的先后顺序,对不。:0...... 这个是可以实现的。

oksimple commented 8 years ago

@lsxiao

    @Subscribe(threadMode = ThreadMode.POSTING, sticky = true, priority = 100)
    public void onSomeEvent(EventBusBean eventBusBean) {
        btn.setText(eventBusBean.getName());
        //高优先级的订阅者 可以终止事件的往下传递,数字越大优先级越高
        //在这里终止了往下传递,也就是优先级50将不会收到消息
        //注意此方法只能在 POSTING 线程中调用 否则会报异常,也就是和发布者处在同一个线程
        EventBus.getDefault().cancelEventDelivery(eventBusBean);
    }

    @Subscribe(threadMode = ThreadMode.POSTING, sticky = true, priority = 50)
    public void onEvent(EventBusBean eventBusBean) {
        btn.setText(eventBusBean.getName());
        //移除sticky事件
        // EventBus.getDefault().removeStickyEvent(eventBusBean);
    }

这两个方法 能够接收同一个 消息,他们可以这样设置优先级谁的消息先到达 priority = 50。。。。 EventBus.getDefault().cancelEventDelivery(eventBusBean); 当此方法接收到消息后 就禁止了其他方法收到消息

Sloaix commented 8 years ago

@oksimple 我之前在知乎上,其实说到过解决方案的,也就是NORMAL_NOCE,接收一次普通事件后自己解绑就可以了,不会再次接收到事件。

但是后面因为什么原因(忘了)我在写STICKY_ONCE的时候就没实现,不过这个功能和权重是两个不同的feature了,权重的功能还是挺有用的,我也会实现的,那就在0.1.4.alpha.2版本发布。

最后,谢谢你的建议,很棒! :)

Sloaix commented 8 years ago

我已经写出了一个demo了,但是由于Apollo支持了RxJava的调度器,如果两个subscriber的线程不同的话,subscriber的接收事件的顺序也是无序的,权重的话也没有意义了,这样会导致很多问题。

目前的话可能暂不考虑增加权重功能,我个人建议可以尽量用不同的tag的subscriber来实现。

oksimple commented 8 years ago

@lsxiao 其实多tag 也不影响 毕竟 post消息还是挺方便的