EventBus的使用非常簡(jiǎn)單,主要分為3個(gè)步驟:
定義事件舰讹。
訂閱事件月匣。
發(fā)布事件。
第一步锄开,定義事件萍悴。事件可以是任意普通的Java對(duì)象,沒(méi)有任何特殊的要求癣诱。例如:
public class MessageEvent{
privateString message;
public MessageEvent(String message){
this.message = message;
? ? }
public Stringget Message(){
return message;
? ? }
public void setMessage(String message){
this.message = message;
? ? }
}
第二步撕予,訂閱事件。訂閱者需要定義事件處理方法(也稱(chēng)為訂閱者方法)欠母。當(dāng)發(fā)布對(duì)應(yīng)類(lèi)型的事件時(shí)澜术,該方法將被調(diào)用猬腰。EventBus 3使用@Subscribe注解來(lái)定義訂閱者方法。方法名可以是任意合法的方法名盒延,參數(shù)類(lèi)型為訂閱事件的類(lèi)型鼠冕。例如:
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event){
? ? ...
}
訂閱者還需要在總線上注冊(cè),并在不需要時(shí)在總線上注銷(xiāo)计露。只有訂閱者注冊(cè)了,它們才會(huì)收到事件叉趣。在Android中该押,可以根據(jù)Activity或者Fragment的生命周期來(lái)注冊(cè)和注銷(xiāo)。例如:
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
? ? setContentView(R.layout.activity_main);
? ? initContentView();
// 注冊(cè)訂閱者
EventBus.getDefault().register(this);
}
@Override
protectedvoidonDestroy(){
super.onDestroy();
// 注銷(xiāo)訂閱者
EventBus.getDefault().unregister(this);
}? ?
第三步烟具,發(fā)布事件奠蹬。在需要的地方發(fā)布事件,所有訂閱了該類(lèi)型事件并已注冊(cè)的訂閱者將收到該事件玖翅。例如:
// 發(fā)布事件
EventBus.getDefault().post(new MessageEvent("Hello EventBus!"));
下面是一個(gè)例子割以。訂閱事件的代碼如下所示:
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private static final String TAG ="MainActivity";
private TextView mTvMessage;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
? ? ? ? setContentView(R.layout.activity_main);
? ? ? ? initContentView();
// 注冊(cè)訂閱者
EventBus.getDefault().register(this);
? ? }
private void initContentView(){
? ? ? ? Button btnStart = findViewById(R.id.btn_main_start_activity);
? ? ? ? mTvMessage = findViewById(R.id.tv_main_message);
btnStart.setOnClickListener(this);
? ? }
@Override
publicvoidonClick(View v){
if(v.getId() == R.id.btn_main_start_activity) {
SecondActivity.start(this);
? ? ? ? }
? ? }
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event){
Log.i(TAG,"message is "+ event.getMessage());
// 更新界面
? ? ? ? mTvMessage.setText(event.getMessage());
? ? }
@Override
protectedvoidonDestroy(){
super.onDestroy();
// 注銷(xiāo)訂閱者
EventBus.getDefault().unregister(this);
? ? }
}
MainActivity訂閱了MessageEvent事件严沥。當(dāng)接收到MessageEvent事件時(shí)消玄,訂閱者方法將打印日志消息,并更新界面上的TextView翩瓜。
發(fā)布事件的代碼如下所示:
public class SecondActivity extends AppCompatActivity implements View.OnClickListener{
public static void start(Context context){
Intent intent =new Intent(context, SecondActivity.class);
? ? ? ? context.startActivity(intent);
? ? }
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
? ? ? ? setContentView(R.layout.activity_second);
? ? ? ? initContentView();
? ? }
private void initContentView(){
findViewById(R.id.btn_second_post_event).setOnClickListener(this);
? ? }
@Override
public void onClick(View v){
if(v.getId() == R.id.btn_second_post_event) {
// 發(fā)布事件
EventBus.getDefault().post(newMessageEvent("Hello EventBus!"));
? ? ? ? }
? ? }
}