EventBus是greenrobot在Android平台发布的一款以订阅——发布模式为核心的开源库。EventBus翻译过来是事件总线的意思,可以这样理解:一个个事件(event)发送到总线上,然后EventBus根据已注册的订阅者(subscribers)来匹配相应的事件,进而把事件传递给订阅者,这也是
观察者模式的一个最佳实践。
一.添加依赖
compile 'org.greenrobot:eventbus:3.0.0'
二.创建事件实体类
发送的时候发送的是这个实体类
/** * Created by Shinelon on 2018/3/25. * 定义用来传输的数据的类型。 */ public class MessageEvent { private String message; public MessageEvent(String message) { this.message = message; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
三. 向eventbus 注册 以及解除注册
EventBus.getDefault().register(this);
if (EventBus.getDefault().isRegistered(this)) { EventBus.getDefault().unregister(this); }
四.声明订阅方法
也就是接受到事件后要执行的方法
@Subscribe(threadMode = ThreadMode.POSTING,sticky = true) public void ononMoonStickyEvent(MessageEvent messageEvent){ stickyTv.setText(messageEvent.getMessage()); }
最后贴下代码:
public class MainActivity extends AppCompatActivity { @BindView(R.id.main_tv) TextView tv; @BindView(R.id.main_button) Button button; @BindView(R.id.sticky_tv) TextView stickyTv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); //在点击订阅按钮时候 这段要取消 EventBus.getDefault().register(this); } public void onViewClicked() { } @Subscribe(threadMode = ThreadMode.MAIN) public void Event(MessageEvent messageEvent) { tv.setText(messageEvent.getMessage()); } /** * 需要取消oncreate中的注册 把注册放到订阅按钮中 * @param messageEvent */ @Subscribe(threadMode = ThreadMode.POSTING,sticky = true) public void ononMoonStickyEvent(MessageEvent messageEvent){ stickyTv.setText(messageEvent.getMessage()); } @Override protected void onDestroy() { super.onDestroy(); if (EventBus.getDefault().isRegistered(this)) { EventBus.getDefault().unregister(this); } } @OnClick({R.id.main_button, R.id.subscribe_bt}) public void onViewClicked(View view) { switch (view.getId()) { case R.id.main_button: Intent intent = new Intent(this, SecondActivity.class); startActivity(intent); break; case R.id.subscribe_bt: EventBus.getDefault().register(this); break; } } }
第二个activity:
public class SecondActivity extends AppCompatActivity { @BindView(R.id.tv_second) TextView tvSecond; @BindView(R.id.second_button) Button button; @BindView(R.id.recive_tv) TextView reciveTv; @BindView(R.id.sticky_bt) Button stickyBt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); ButterKnife.bind(this); } @OnClick({R.id.second_button, R.id.sticky_bt}) public void onViewClicked(View view) { switch (view.getId()) { case R.id.second_button: EventBus.getDefault().post(new MessageEvent("测试一下evenbus")); break; case R.id.sticky_bt: EventBus.getDefault().postSticky(new MessageEvent("粘性事件")); break; } } }