EventBus对大家来说肯定都不陌生,EventBus是一款针对Android优化的发布/订阅事件总线。平时我们在写Fragment和Activity之间传递数据时,一般都是通过定义接口或者发送广播等等实现。我用的最多的就是定义接口来传递数据,早就听说使用EventBus非常优雅并且体积小,重点是将接收者与发送者解耦。今天任务不多,就来撸个demo感受下EventBus的魅力。
先看效果图
在使用EventBus之前我们需要导入,下面给出地址:https://github.com/greenrobot/EventBus/
首先在Gradle中添加:
compile ‘org.greenrobot:eventbus:3.0.0’
接下来我们就可以开始体验了,使用也非常简单
在onCreate()中注册EventBus
EventBus.getDefault().register(this);
有注册就有取消注册,在onDestroy()中取消注册
EventBus.getDefault().unregister(this);
关于EventBus的介绍网上有很多,我就不啰嗦了,直接进入主题,通过一个测试demo说一下怎么快速使用它。模拟的场景是这样的:在MainActivity中我们定义一个TextView和一个Button,一个用来接收OtherActivity传过来的数据消息,一个作跳转操作。而在OtherActivity中主要做的操作就是通过EventBus的post()方法传递消息,这里传递一个字符串。
首先我们定义一个Event类
public class MyFirstEvent {
private String info;
public MyFirstEvent(String info){
this.info = info;
}
public String getInfo(){
return info;
}
}
接下来看看我们的MainActivity,用来接收消息的
public class MainActivity extends AppCompatActivity {
private Button btn;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("MainActivity");
//注册EventBus
EventBus.getDefault().register(this);
btn = (Button) findViewById(R.id.btn);
textView = (TextView) findViewById(R.id.tv);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,OtherActivity.class);
startActivity(intent);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
//取消注册
EventBus.getDefault().unregister(this);
}
@Subscribe
public void onInfoEvent(MyFirstEvent event){
//接收到OtherActivity传递过来的消息
String info = event.getInfo();
textView.setText(info);
}
}
从上面代码可以看到我们定义了一个onInfoEvent(MyFirstEvent event)方法,EventBus 3.0之后需要在方法名的上面添加注解@Subscribe,表明此方法是以onEvent开头的方法,所以,这里的方法名就可以随意取名了。之前版本的方法名都是以onEvent开头的,这是因为我们在注册的时候EventBus.getDefault().register(this);这个register就是用来遍历此类中的所有方法,找到onEvent开头的然后进行存储。
然后看一下OtherActivity中都做了什么
public class OtherActivity extends AppCompatActivity {
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_other);
setTitle("OtherActivity");
btn = (Button) findViewById(R.id.btn2);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EventBus.getDefault().post(new MyFirstEvent("接收到了OtherActivity传递过来的消息"));
finish();
}
});
}
}
此Activity是用来发送消息的,在此activity中不用去注册EventBus,使用起来是不是灰常灰常简单,,如果我们想传递一个List集合,那么我们就需要在自定义MyFirstEvent类中这样做,这里我就不测试了,采用泛型的方式,方便修改List集合中的类型
public class MyFirstEvent<T> {
private List<T> lists;
public MyFirstEvent(List<T> lists){
this.lists = lists;
}
public List<T> getInfoList(){
return lists;
}
}