Greenrobot EventBus粘性事件订单是否有保证?

时间:2016-07-27 06:30:55

标签: android event-bus greenrobot-eventbus-3.0

我开始使用EventBus 3.0.0。

我有3个粘性事件要从服务发送到活动:

  1. 行动开始
  2. 行动进展
  3. 行动完成
  4. 我正在听主线上的事件:

    @Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
    public void on...Event(... event) {
    ...
    }
    

    服务按顺序发送事件:started-progressN-..-progressM-finished,订阅的Activity根据事件更新UI。

    活动旋转后,我希望按照发送的顺序获得粘性事件,否则它会破坏ui(因为在启动时将进度设置为0)。事件顺序是否由EventBus保证(假设我使用相同的EventBus,相同的接收者线程,所有这些事件的相同订阅者)?

    根据我的测试它无法保证,这是功能/问题,是吗?

    旋转前

    07-27 11:27:55.254  27910-27910/ app D/App﹕ status Compilation started ...
    07-27 11:27:55.254  27910-27910/ app D/App﹕ compile progress 0%
    07-27 11:27:55.354  27910-27910/ app D/App﹕ compile progress 20%
    07-27 11:27:55.354  27910-27910/ app D/App﹕ compile progress 30%
    07-27 11:27:55.354  27910-27910/ app D/App﹕ compile progress 40%
    07-27 11:27:55.844  27910-27910/ app D/App﹕ compile progress 50%
    
    轮换后

    (重新发送粘性事件):

    07-27 11:27:59.554  27910-27910/ app D/App﹕ compile progress 50%
    07-27 11:27:59.554  27910-27910/ app D/App﹕ status Compilation started ...
    

1 个答案:

答案 0 :(得分:3)

我还没有尝试过,但文档here表示您可以为每个onEvent方法指明优先级。

猜测你有3个事件类,如CompilationStart,CompilationProgress和CompilationFinish,你可以分别提供3,2和1的优先级。无论如何,请记住默认优先级为0,因此在所有这些事件之前将收到任何其他事件:

@Subscribe(priority = 3);
public void onEvent(CompilationStart event) {
    ...
}
@Subscribe(priority = 2);
public void onEvent(CompilationProgress event) {
    ...
}
@Subscribe(priority = 1);
public void onEvent(CompilationFinish event) {
    ...
}

另一方面,如果您只使用CompilationInfo这样的一个类,则可以避免使用优先级,如下所示:

public class CompilationInfo {
    public CompilationState compilationState;
    public int priority

    public CompilationInfo(CompilationState compilationState, int priority) {
        this.compilationState = compilationState;
        this.priority = priority;
    }
}

其中CompilationState是CompilationStart,CompilationProgress和CompilationFinish hinerits的父类。如果你使用enum作为优先级字段会更好,因为它更具可读性。这样你只需要一个onEvent方法。

编辑:根据文档更改更改优先级值