一、寫在前面

還在為時間接收而煩惱嗎?還在為各種組件間的消息傳遞煩惱嗎?EventBus 3.0,專注于android的發(fā)布、訂閱事件總線,讓各組件間的消息傳遞更簡單!完美替代Intent,Handler,BroadCast,接口等傳統(tǒng)方案。這么優(yōu)雅的功能實(shí)現(xiàn),卻只有50k左右的jar包,無疑集快、小、優(yōu)雅解耦于一身,目前最新版本為3.0,與之前版本有所沖突,官方網(wǎng)址:https://github.com/greenrobot/EventBus

 

二、使用簡介

總的流程只需要4步:添加依賴=>編寫事件類=>發(fā)送事件=>接收事件并處理。

通過一個例子說明:例子為三個Activity,入口Activity點(diǎn)擊一個Button跳轉(zhuǎn)到第二個Activity,第二個Activity點(diǎn)擊跳轉(zhuǎn)第三個,第三個可以發(fā)送數(shù)據(jù)讓第一個Activity接收,具體可看下面的gif圖,代碼詳見github:https://github.com/nanchen2251/EventbusDemo

1、添加依賴 

1 compile 'org.greenrobot:eventbus:3.0.0'

2、編寫事件類,這里可以傳遞任意類型,先來傳遞一個Object類吧

復(fù)制代碼
 1 package com.nanchen.ischool.eventbusdemo;  2  3 /**  4  * @author nanchen  5  * @fileName EventBusDemo  6  * @packageName com.nanchen.ischool.eventbusdemo  7  * @date 2016/11/22  15:42  8 */  9 10 public class MessageEvent { 11 private User mUser; 12 13 public MessageEvent(User user) { 14 mUser = user; 15  } 16 17 public User getUser() { 18 return mUser; 19  } 20 21 public void setUser(User user) { 22 mUser = user; 23  } 24 }
復(fù)制代碼

User類很簡單

復(fù)制代碼
 1 package com.nanchen.ischool.eventbusdemo;  2  3 /**  4  * @author nanchen  5  * @fileName EventBusDemo  6  * @packageName com.nanchen.ischool.eventbusdemo  7  * @date 2016/11/22  15:42  8 */  9 10 public class User { 11 private String username; 12 private String password; 13 14 public User(String username, String password) { 15 this.username = username; 16 this.password = password; 17  } 18 19 public String getUsername() { 20 return username; 21  } 22 23 public void setUsername(String username) { 24 this.username = username; 25  } 26 27 public String getPassword() { 28 return password; 29  } 30 31 public void setPassword(String password) { 32 this.password = password; 33  } 34 }
復(fù)制代碼

 

3、post發(fā)送事件(這里我是使用三個Activity,布局只有簡單的Button和TextView,具體代碼可上github查看)

復(fù)制代碼
 1 package com.nanchen.ischool.eventbusdemo;  2  3 import android.support.v7.app.AppCompatActivity;  4 import android.os.Bundle;  5 import android.view.View;  6 import android.widget.EditText;  7  8 import org.greenrobot.eventbus.EventBus;  9 10 public class Main3Activity extends AppCompatActivity { 11 12 private EditText mEditUsername; 13 private EditText mEditPwd; 14 15  @Override 16 protected void onCreate(Bundle savedInstanceState) { 17 super.onCreate(savedInstanceState); 18  setContentView(R.layout.activity_main3); 19 mEditUsername = (EditText) findViewById(R.id.edit_username); 20 mEditPwd = (EditText) findViewById(R.id.edit_pwd); 21  } 22 23 public void btnClick3(View view) { 24 String username = mEditUsername.getText().toString().trim(); 25 String password = mEditPwd.getText().toString().trim(); 26 EventBus.getDefault().post(new MessageEvent(new User(username,password))); 27  finish(); 28  } 29 }
復(fù)制代碼

 

4、訂閱者接收事件

復(fù)制代碼
 1 package com.nanchen.ischool.eventbusdemo;  2  3 import android.content.Intent;  4 import android.os.Bundle;  5 import android.support.v7.app.AppCompatActivity;  6 import android.view.View;  7 import android.widget.TextView;  8  9 import org.greenrobot.eventbus.EventBus; 10 import org.greenrobot.eventbus.Subscribe; 11 import org.greenrobot.eventbus.ThreadMode; 12 13 public class MainActivity extends AppCompatActivity { 14 15 private TextView mTextView; 16 17  @Override 18 protected void onCreate(Bundle savedInstanceState) { 19 super.onCreate(savedInstanceState); 20  setContentView(R.layout.activity_main); 21 22 mTextView = (TextView) findViewById(R.id.text); 23 24 if (!EventBus.getDefault().isRegistered(this)){ 25 EventBus.getDefault().register(this); 26  } 27  } 28 29 public void btnClick(View view) { 30 startActivity(new Intent(this,Main2Activity.class)); 31  } 32 33 @Subscribe(threadMode = ThreadMode.MAIN) 34 public void onEventMainThread(MessageEvent event) { 35 if (event.getUser() != null){ 36 mTextView.setText("用戶名:"+event.getUser().getUsername() 37 +",密碼:"+event.getUser().getPassword()); 38  } 39  } 40 41 42  @Override 43 protected void onDestroy() { 44 super.onDestroy(); 45 EventBus.getDefault().unregister(this); 46  } 47 }
復(fù)制代碼

三、注意事項

1、注冊一般寫在onCreate或者onStart中,盡量不要寫在onResume,可能出現(xiàn)多次注冊,比如:
EventBusException: Subscriber class already registered to event class

2、取消注冊一定寫在onDestory,寫在onStop可能會引發(fā)異常;

3、建議注冊前先判斷一下是否已經(jīng)注冊,避免重復(fù)注冊,并且注冊盡量放在各變量初始化最后,以免造成空指針異常;

1 if (!EventBus.getDefault().isRegistered(this)) { 2 EventBus.getDefault().register(this); 3 }

4、3.0和之前版本不兼容,現(xiàn)在采用注解的方法來接收事件,四種注解方式分別為:

1)  @Subscrible  對應(yīng)之前的onEvent();

2)  @Subscrible(threadMode = ThreadMode.ASYNC) 對應(yīng)之前的onEventAsync();

3)  @Subscrible(threadMode = ThreadMode.BACKGRAND) 對應(yīng)之前的onEventBackground();

4)  @Subscrible(threadMode = ThreadMode.MAIN) 對應(yīng)之前的onEventMainThread();

5、采用注解后方法名沒有限制了,參數(shù)只有一個,和發(fā)送者post的參數(shù)對應(yīng)配對,未聲明threadMode的時候默認(rèn)線程模式是ThreadMode.POSTING,只有在該模式下才可以取消線程,否則容易導(dǎo)致如下異常:org.greenrobot.eventbus.EventBusException: This method may only be called from inside event handling methods on the posting thread

6、一個事件不支持重復(fù)注冊,否則會報異常。

四、寫在最后

有不理解的請在評論區(qū)留言,博主一向都是直播模式對待每一篇博客,如果你喜歡,點(diǎn)個推薦吧~轉(zhuǎn)載請附帶本文鏈