1.EventBus
1.1 EventBus是什么?
EventBus由greenrobot组织贡献(该组织还贡献了greenDAO),一个Android事件发布/订阅轻量级框架,下面来一张图作为说明。
EventBus说明
1.2 EventBus优势
-
我们可以通过解耦发布者和订阅者简化Android事件传递。
-
EventBus可以代替Android传统的Intent、Handler、Broadcast或接口函数,在Fragment,Activity,Service线程之间传递数据,执行方法,而且代码简单。
- 快,高性能:特别是在注重性能的Android上。也许在其同类的解决方案是最快的。
- 小(jar包小于50K),但是强大:EventBus是一个很小的库,它的API超级简单。
- android主线程传递:当和UI交互的时候,无论这个事件是怎么提交的,EventBus都可以在主线程传递事件。
1.3 使用教程
1.3.1 添加依赖
首先在你的项目中添加eventbus的依赖
implementation 'org.greenrobot:eventbus:3.1.1'
1.3.2 注册销毁EventBus
接着,在接收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);
}
}
1.3.3 更新UI
值得注意的是,对于接收端更新UI的操作最好在主线程中实现,因为很容易发生崩溃
// 在主线程更新UI
@Subscribe(threadMode = ThreadMode.MAIN)
public void Event(String string) {
textView.setText(string);
}
1.3.4 完整代码
接收端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();
}
});
}
}
1.3.5 效果展示
第一个界面是接收Activity,第二个界面是发送Activity,在第二个界面点击“进入跳转到首页”按钮,会用EventBus传递需要更新的UI数据,并跳转到第一个页面。回到第一个页面,EventBus接收,完成刷新UI操作。
刷新首页功能
在实际开发中,我们经常会遇到这种需求:即在某一个模块,完成某一操作后。然后在首页会进行要求同步显示,进行UI更新。这要求实现首页实时刷新功能。针对这一需求,我考虑采用EventBus去实现。那么怎么实现呢,请您继续阅读。
2.1 需求分析
由于前端的数据都是请求后台接口得到的,进而更新展示对应的UI,那么刷新流程为:
- 在特定页面完成操作后,可以发送一个更新指令给首页
- 首页接收指令后,首页调用上拉,下拉方法
- 执行上拉下拉方法的过程中,向后台对应接口进行请求,更新数据
- 更新数据后,改变UI,实现刷新功能
2.2 实现代码
利用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 是我设置的一个完成标志,这个参数首页接收到后,就执行刷新方法,重新进行网络请求,实现刷新功能。
参考文献