我们要做的第一件事是将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作为参数的方法,然后在要调用的线程上调用它们。