1.Event 事件。它可以是任意类型。
2.Subscriber 事件订阅者。在EventBus3.0之前我们必须定义以onEvent开头的那几个方法,分别是onEvent、onEventMainThread、onEventBackgroundThread和onEventAsync,而在3.0之后事件处理的方法名可以随意取,不过需要加上注解@subscribe(),并且指定线程模型,默认是POSTING。
3.Publisher 事件的发布者。我们可以在任意线程里发布事件,一般情况下,使用EventBus.getDefault()就可以得到一个EventBus对象,然后再调用post(Object)方法即可。
举个例子,我需要在一个Activity里注册EventBus事件,然后定义接收方法,这跟Android里的广播机制很像,你需要首先注册广播,然后需要编写内部类,实现接收广播,然后操作UI。所以,在EventBus中,你同样得这么做。
public class MessageEvent { private String msg; public MessageEvent(String msg) { this.msg = msg; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } }
订阅者需要定义事件处理方法(也称为订阅者方法)。当发布对应类型的事件时,该方法将被调用。EventBus 3使用 @Subscribe 注解来定义订阅者方法。方法名可以是任意合法的方法名,参数类型为订阅事件的类型。
例如:
@Subscribe(threadMode = ThreadMode.MAIN) public void showMsg(MessageEvent event){ ... }
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ... //注册EventBus EventBus.getDefault().register(this); }
@Override protected void onDestroy() { super.onDestroy(); //解除订阅EventBus EventBus.getDefault().unregister(this);}
在MianActivity启动SecondActivity,后点击按钮关闭SecondActivity并回调消息到MianActivity,MainActivity接收显示。
事件类型:
public class MessageEvent { private String msg; public MessageEvent(String msg) { this.msg = msg; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } }
我的MainActivity:
public class MainActivity extends AppCompatActivity implements View.OnClickListener { private TextView content_tv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.main_tv).setOnClickListener(this); content_tv= (TextView) findViewById(R.id.content_tv); //注册EventBus EventBus.getDefault().register(this); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.main_tv: Intent intent =new Intent(this,SecondActivity.class); startActivity(intent); break; } } /** * 订阅者需要定义事件处理方法(也称为订阅者方法)。 * 当发布对应类型的事件时,该方法将被调用。 * EventBus 3使用 @Subscribe 注解来定义订阅者方法。 * 方法名可以是任意合法的方法名,参数类型为订阅事件的类型。 * */ @Subscribe(threadMode = ThreadMode.MAIN) public void showMsg(MessageEvent event){ content_tv.setText(event.getMsg()); } @Override protected void onDestroy() { super.onDestroy(); //解除订阅EventBus EventBus.getDefault().unregister(this); } }
我的SecondActivity:
public class SecondActivity extends Activity implements View.OnClickListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); findViewById(R.id.second_tv).setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.second_tv: //发送消息 EventBus.getDefault().post(new MessageEvent("你们都是大大大帅哥")); finish(); break; } } }