EventBus由greenrobot组织贡献(该组织还贡献了greenDAO),一个Android事件发布/订阅轻量级框架,下面来一张图作为说明。
EventBus说明
我们可以通过解耦发布者和订阅者简化Android事件传递。
EventBus可以代替Android传统的Intent、Handler、Broadcast或接口函数,在Fragment,Activity,Service线程之间传递数据,执行方法,而且代码简单。
首先在你的项目中添加eventbus的依赖
implementation 'org.greenrobot:eventbus:3.1.1'
接着,在接收Activity的onCreate()方法中注册EventBus
EventBus.getDefault().register(this);
其次,在接收Activity的onDestory()中注销EventBus
@Override
protected void onDestroy() {
super.onDestroy();
if(EventBus.getDefault().isRegistered(this)) {
EventBus.getDefault().unregister(this);
}
}
值得注意的是,对于接收端更新UI的操作最好在主线程中实现,因为很容易发生崩溃
// 在主线程更新UI
@Subscribe(threadMode = ThreadMode.MAIN)
public void Event(String string) {
textView.setText(string);
}
接收端activity代码。
public class MainActivity extends AppCompatActivity {
private Button btnCommon;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 首先要在你要接受EventBus的界面注册,这一步很重要
EventBus.getDefault().register(this);
btnCommon = (Button) findViewById(R.id.btn_common);
textView = (TextView)findViewById(R.id.tv_content);
textView.setText("今天是星期五!");
jumpActivity();
}
private void jumpActivity() {
btnCommon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this, CommonActivity.class);
startActivity(intent);
}
});
}
// 在主线程更新UI
@Subscribe(threadMode = ThreadMode.MAIN)
public void Event(String string) {
textView.setText(string);
}
// 注销EventBus
@Override
protected void onDestroy() {
super.onDestroy();
if(EventBus.getDefault().isRegistered(this)) {
EventBus.getDefault().unregister(this);
}
}
}
下面在看发送端,我们在点击事件中,加入一个EventBus事件,进行传值。
public class CommonActivity extends AppCompatActivity {
private Button button;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_activity);
button = (Button) findViewById(R.id.btn2);
jumpActivity();
}
private void jumpActivity() {
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EventBus.getDefault().post("欢迎大家!");
finish();
}
});
}
}
第一个界面是接收Activity,第二个界面是发送Activity,在第二个界面点击“进入跳转到首页”按钮,会用EventBus传递需要更新的UI数据,并跳转到第一个页面。回到第一个页面,EventBus接收,完成刷新UI操作。
在实际开发中,我们经常会遇到这种需求:即在某一个模块,完成某一操作后。然后在首页会进行要求同步显示,进行UI更新。这要求实现首页实时刷新功能。针对这一需求,我考虑采用EventBus去实现。那么怎么实现呢,请您继续阅读。
由于前端的数据都是请求后台接口得到的,进而更新展示对应的UI,那么刷新流程为:
利用EventBus,我们可以在操作页面向首页发送一个参数,告诉首页进行刷新操作。主要代码逻辑如下:
private void gameFinish() {
//发送消息首页刷新状态
EventBusBean eventBusBean = new EventBusBean();
eventBusBean.setCode(EventBusConstant.TASK_REFRESH_CODE);
EventBus.getDefault().post(eventBusBean);
try {
// todo
// 逻辑操作
}
catch (Exception e) {
e.printStackTrace();
}
// todo 关闭页面操作
}
在首页接收中,我们在在主线程中执行刷新操作,进而实现同步更新内容。
/**
* 接收传递来的数据进行刷新
* @param eventBusBean 数据
*/
@Subscribe(threadMode = ThreadMode.MAIN)
public void getOnEvent(EventBusBean eventBusBean) {
if (eventBusBean.getCode() == EventBusConstant.TASK_REFRESH_CODE) {
if (checkSubjectBean != null) {
page = 1;
mSRefreshLayout.autoRefresh();
}
}
}
值得一说的是,在上面代码中 EventBusConstant.TASK_REFRESH_CODE 是我设置的一个完成标志,这个参数首页接收到后,就执行刷新方法,重新进行网络请求,实现刷新功能。
参考文献
https://www.jianshu.com/p/1e8191bc7bc2