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作为参数的方法,然后在要调用的线程上调用它们。