从最简单的开始
EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。
1、下载EventBus的类库
源码:https://github.com/greenrobot/EventBus
可以直接添加依赖:
compile 'org.greenrobot:eventbus:3.0.0'
- 基本使用步骤
1.写一个事件类,用来消息传递等
public class DemoEvent {
private String mMsg;
public DemoEvent(String msg) {
mMsg = msg;
}
public String getMsg(){
return mMsg;
}
}
2.为订阅者注册EventBus
EventBus.getDefault().register(this);
3.订阅者取消注册
EventBus.getDefault().unregister(this);//取消注册EventBus
4.发布者发布消息
EventBus.getDefault().post(
new DemoEvent("DemoEvent btn clicked"));
5.订阅者重写方法进行消息回调
@Subscribe
public void onEventMainThread(DemoEvent event) {
String msg = "onEventMainThread收到了消息:" + event.getMsg();
bt.setText(msg);
Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
}
通过这五个步骤,就实现了消息的传递,大家并没有看到handle等。
先看一下一个简单的Demo效果图
在MainActivity点击按钮进入SecondActivity界面,点击发送消息按钮,在主界面中接收到消息并吐司,改变文本内容,这边布局就不贴了。
- 第一步,一个事件类
public class DemoEvent {
private String mMsg;
public DemoEvent(String msg) {
mMsg = msg;
}
public String getMsg(){
return mMsg;
}
}
- 第二步,在订阅者注册EventBus
这里的订阅者就是MainActivity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//注册EventBus
EventBus.getDefault().register(this);
bt = (Button) findViewById(R.id.bt);
tv = (TextView) findViewById(R.id.tv);
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//点击跳转
Intent intent=new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
}
});
}
- 第三步,取消注册
在MainActivity的onDestroy取消注册
@Override
protected void onDestroy(){
super.onDestroy();
EventBus.getDefault().unregister(this);//取消注册EventBus
}
- 第四步,SecondActivity界面发送消息
public class SecondActivity extends AppCompatActivity {
private Button bu;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
bu = (Button) findViewById(R.id.button);
bu.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//发送消息,参数为自己定义的事件类
EventBus.getDefault().post(
new DemoEvent("DemoEvent btn clicked"));
}
});
}
}
- 第五步,订阅者接收事件消息
@Subscribe
public void onEventMainThread(DemoEvent event) {
String msg = "onEventMainThread收到了消息:" + event.getMsg();
tv.setText(msg);
bt.setText(msg);
Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
}
这里只使用了onEventMainThread这个方法,当然还有其它的方法,以后慢慢介绍。@Subscribe,这个注解必须加上,不然会报错。在这个方法中,我们将接收到自己发过来的事件对象,然后对消息进行处理。
到这里MainActivity中的代码全部完成了。
public class MainActivity extends Activity {
private Button bt;
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//注册EventBus
EventBus.getDefault().register(this);
bt = (Button) findViewById(R.id.bt);
tv = (TextView) findViewById(R.id.tv);
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//点击跳转
Intent intent=new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
}
});
}
//接收消息的方法,注释必须添加
@Subscribe
public void onEventMainThread(DemoEvent event) {
String msg = "onEventMainThread收到了消息:" + event.getMsg();
tv.setText(msg);
bt.setText(msg);
Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
}
@Override
protected void onDestroy(){
super.onDestroy();
EventBus.getDefault().unregister(this);//取消注册EventBus
}
}