传递一个简单的事件

我们需要做的第一件事是将 EventBus 添加到我们模块的 gradle 文件中:

dependencies {
    ...
    compile 'org.greenrobot:eventbus:3.0.0'
    ...
}

现在我们需要为我们的活动创建一个模型。它可以包含我们想要传递的任何内容。现在我们只是做一个空课。

public class DeviceConnectedEvent
{
}

现在我们可以将代码添加到我们的 Activity 中,该代码将向 EventBus 注册并订阅该事件。

public class MainActivity extends AppCompatActivity
{
    private EventBus _eventBus;

    @Override
    protected void onCreate (Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        _eventBus = EventBus.getDefault();
    }

    @Override
    protected void onStart ()
    {
        super.onStart();
        _eventBus.register(this);
    }

    @Override
    protected void onStop ()
    {
        _eventBus.unregister(this);
        super.onStop();
    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onDeviceConnected (final DeviceConnectedEvent event)
    {
        // Process event and update UI
    }
}

在这个 Activity 中,我们在 onCreate() 方法中得到了 EventBus 的一个实例。我们注册/取消注册 onStart() / onStop() 中的活动。重要的是要记得当你的听众失去范围或你可能泄漏你的时候取消注册 7。

最后,我们定义了我们想要用事件调用的方法。@Subscribe 注释告诉 EventBus 它可以寻找哪些方法来处理事件。你必须至少有一个使用 @Subscribe 注释的方法向 EventBus 注册,否则它将抛出异常。在注释中我们定义了线程模式。这告诉 EventBus 调用该方法的线程。这是将信息从后台线程传递到 UI 线程的一种非常方便的方法! 这正是我们在这里所做的。ThreadMode.MAIN 意味着将在 Android 的主 UI 线程上调用此方法,因此可以安全地在此处执行任何需要的 UI 操作。方法的名称无关紧要。唯一的想法,即 eventBus 正在寻找的 @Subscribe 注释的另一个是参数的类型。

发布一个事件我们需要做的最后一件事。此代码将在我们的 Service 中。

EventBus.getDefault().post(new DeviceConnectedEvent());

这里的所有都是它的! EventBus 将获取该 DeviceConnectedEvent 并查看其已注册的侦听器,查看它们已订阅的方法,并找到将 DeviceConnectedEvent 作为参数的方法,并在要调用它们的线程上调用它们。