3.发布事件:
EventBus.getDefault().post(new MessageEvent(“Hello EventBus!”));
下面简单例子,点击MainActivity
按钮启动SecondActivity
, 在SecondActivity
中给MainActivity
页面发送一个消息
public class MainActivity extends Activity implements View.OnClickListener {
private final static String TAG = MainActivity.class.getSimpleName();
private Button mGoBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
EventBus.getDefault().register(this);
}
private void initView() {
mGoBtn = (Button) findViewById(R.id.btn_go);
mGoBtn.setOnClickListen
er(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_go:
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
break;
default:
break;
}
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {
//接收消息改变按钮文字并打印信息
mGoBtn.setText(event.getMessage());
Log.e(TAG, "onMessageEvent: " + event.getMessage());
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
}
public class SecondActivity extends Activity implements View.OnClickListener {
private Button mSendBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
initView();
}
private void initView() {
mSendBtn = (Button) findViewById(R.id.btn_send);
mSendBtn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_send:
//点击按钮给第一个页面发送消息
EventBus.getDefault().post(new MessageEvent(“Hello EventBus!”));
break;
default:
break;
}
}
}
注意发送方的页面如果不需要接收事件就不需要进行EventBus的注册,发送方只需要调用EventBus.getDefault().post()
这句即可。
EventBus线程模式
EventBus支持订阅者和发布者在不同的线程中调用。你可以使用线程模式来指定调用订阅者方法的线程。EventBus总共支持5种线程模式:
-
ThreadMode.POSTING 订阅者方法将在发布事件所在的线程中被调用。这是 默认的线程模式。事件的传递是同步的,一旦发布事件,所有该模式的订阅者方法都将被调用。这种线程模式意味着最少的性能开销,因为它避免了线程的切换。因此,对于不要求是主线程并且耗时很短的简单任务推荐使用该模式。使用该模式的订阅者方法应该快速返回,以避免阻塞发布事件的线程,这可能是主线程。
-
ThreadMode.MAIN 订阅者方法将在主线程(UI线程)中被调用。因此,可以在该模式的订阅者方法中直接更新UI界面。如果发布事件的线程是主线程,那么该模式的订阅者方