EventBus是一个Android和Java的发布/订阅事件总线模型,其模型图如下所示:
EventBus的优点有:
从模型图中可以看到几个概念:
在Android中考虑一个场景,Activity A需要显示一个从网站上下载的内容,该下载任务在Activity B中进行,完成后,将内容通知给Activity A进行显示。
不使用EventBus的情况下,Activity A使用startActivityForResult请求Activity B,Activity中开启线程进行网络任务,完成后将结果通过setResult返回。 Actiivty A的代码如下:
private TextView showContentTv;
public void downloadPage(View view) {
startActivityForResult(new Intent(this,SecondActivity.class),0);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
showContentTv.setText(data.getStringExtra("content"));
}
Activity B的代码如下:
private Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
if(msg.what==1){
Intent intent=getIntent();
intent.putExtra("content","Hello World From Network");
setResult(0,intent);
finish();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
new Thread(new Runnable() {
@Override
public void run() {
//模拟网络任务
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
handler.sendEmptyMessage(1);
}
}).start();
}
EventBus的基本使用包含三个步骤:
public class MessageEvent {
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void showContent(MessageEvent messageEvent){
showContentTv.setText(messageEvent.getMessage());
}
另外,还需要将Subscriber注册到EventBus中,这个需要在Activity的生命周期方法中进行注册,如下:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
showContentTv=findViewById(R.id.showContentTv);
EventBus.getDefault().register(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
new Thread(new Runnable() {
@Override
public void run() {
//模拟网络任务
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
MessageEvent messageEvent=new MessageEvent();
messageEvent.setMessage("Hello World From Network");
EventBus.getDefault().post(messageEvent);
finish();
}
}).start();
}
经过两种方式的对比,可以看到接入EventBus是一件很简单的事情,并且EventBus可以带来很好的解耦性。
本文分享自 每天学点Android知识 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!