Android 传递一个简单的事件

示例

我们要做的第一件事是将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)
    {
        // 处理事件并更新UI
    }
}

在此,Activity我们获得EventBus了onCreate()方法的实例。我们在onStart()/中注册/注销事件onStop()。请务必记住,当听众失去作用域或可能泄漏您的监听器时,请先注销Activity。

最后,我们定义要与事件一起调用的方法。该@Subscribe注解告诉EventBus它可以查找处理事件的哪些方法。您必须至少具有一种使用方法注释@Subscribe才能向EventBus注册,否则它将引发异常。在注释中,我们定义了线程模式。这告诉EventBus在哪个线程上调用该方法。这是一种将信息从后台线程传递到UI线程的便捷方法!这正是我们在这里所做的。ThreadMode.MAIN意味着将在Android的主UI线程上调用此方法,因此可以在此处进行所需的任何UI操作都是安全的。方法的名称无关紧要。唯一的想法,其他的@Subscribe注解,EventBus正在寻找的是参数的类型。只要类型匹配,事件发布时就会调用它。

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

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

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