Android EventBus(普通事件/粘性事件)详解
什么是Android EventBus?
Android EventBus是一种用于Android应用程序内组件间通信的事件总线框架。它可以简化Android应用程序内组件间的通信,将发布和订阅事件的代码进行分离,降低了组件间的耦合度,同时增加了代码的可读性。运用EventBus,您可以快速而方便地实现组件间的通信,避免了繁琐而冗长的回调方法。
EventBus如何使用?
集成依赖
在项目的build.gradle文件中添加如下依赖:
dependencies {
implementation 'org.greenrobot:eventbus:3.2.0'
}
注册和订阅事件
EventBus使用了生命周期意识的观察者模式。要使用EventBus,首先需要在每个订阅事件的接收方注册EventBus,以便其可以接收事件。
//在Activity中注册EventBus
@Override
protected void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
//在Activity中订阅事件(普通事件)
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {
Toast.makeText(this, event.getMessage(), Toast.LENGTH_SHORT).show();
}
//在Activity中订阅事件(粘性事件)
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
public void onStickyEvent(MessageEvent event) {
Toast.makeText(this, event.getMessage(), Toast.LENGTH_SHORT).show();
}
//在Activity中解注册EventBus
@Override
protected void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}
在订阅事件时,可以设置事件的线程模式。线程模式指定了接收事件的线程,EventBus提供了几种不同的线程模式:
- ThreadMode.MAIN
:事件在主线程中执行
- ThreadMode.BACKGROUND
:事件在EventBus的后台线程中执行
- ThreadMode.ASYNC
:事件在新的线程中执行
默认地,事件在发布事件的线程中执行。如需订阅粘性事件,只需在注解中添加sticky=true
参数即可。
发布事件
要发布事件,只需使用EventBus.getDefault().post()方法,并传入一个事件对象即可:
EventBus.getDefault().post(new MessageEvent("Hello EventBus!"));
粘性事件
粘性事件是一种特殊的事件类型。当事件被发布时,如果在事件的生命周期内通过EventBus.getDefault().postSticky()
方法发布事件,这个事件就会变成粘性事件,所有的订阅者都能接收到这个事件。比如:
EventBus.getDefault().postSticky(new MessageEvent("sticky message"));
EventBus的原理
EventBus使用了观察者模式。所谓观察者模式,就是当被观察者状态发生改变时,观察者会得到通知并进行相应的操作。EventBus将Android应用程序中的每个组件作为被观察者,将所有注册了事件的组件作为观察者,当发布事件时,EventBus会先将事件发送到EventBus的内部队列中,再在后台线程中将事件发送给所有订阅者,订阅者会接收到事件并执行相应的操作。
示例说明
示例1:普通事件
假设我们有两个Activity:MainActivity和SecondActivity,现在我们要通过EventBus来传递一个普通事件。具体实现如下:
- 在MainActivity中注册EventBus,并在其中发布一个普通事件:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 注册EventBus
EventBus.getDefault().register(this);
// 发布事件
EventBus.getDefault().post(new MessageEvent("Hello EventBus!"));
}
// 订阅事件
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {
Toast.makeText(this, event.getMessage(), Toast.LENGTH_SHORT).show();
}
@Override
protected void onDestroy() {
super.onDestroy();
// 解注册EventBus
EventBus.getDefault().unregister(this);
}
}
- 在SecondActivity中注册EventBus,并在其中订阅事件:
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
// 注册EventBus
EventBus.getDefault().register(this);
}
// 订阅事件
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {
Toast.makeText(this, event.getMessage(), Toast.LENGTH_SHORT).show();
}
@Override
protected void onDestroy() {
super.onDestroy();
// 解注册EventBus
EventBus.getDefault().unregister(this);
}
}
运行程序,可以在两个Activity中看到Toast提示,说明事件成功传递。
示例2:粘性事件
假设我们有一个Service:MyService,现在我们要通过EventBus来传递一个粘性事件。具体实现如下:
- 在MyService中发送一个粘性事件:
public class MyService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// 发送粘性事件
EventBus.getDefault().postSticky(new MessageEvent("sticky message"));
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
- 在MainActivity中注册EventBus,并在其中订阅粘性事件:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 注册EventBus
EventBus.getDefault().register(this);
}
// 订阅粘性事件
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
public void onStickyEvent(MessageEvent event) {
Toast.makeText(this, event.getMessage(), Toast.LENGTH_SHORT).show();
// 取消粘性事件
EventBus.getDefault().removeStickyEvent(MessageEvent.class);
}
@Override
protected void onDestroy() {
super.onDestroy();
// 解注册EventBus
EventBus.getDefault().unregister(this);
}
}
运行程序,可以在MainActivity中看到Toast提示,说明事件成功传递。同时,通过EventBus.getDefault().removeStickyEvent(MessageEvent.class)
方法取消了粘性事件。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android EventBus(普通事件/粘性事件)详解 - Python技术站