當Android項目越來越龐大的時候,應用的各個部件之間的通信變得越來越復雜,那么我們通常采用的就是Android中的解耦組件EventBus。EventBus是一款針對Android優化的發布/訂閱事件總線。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,線程之間傳遞消息.優點是開銷小,代碼更優雅。以及將發送者和接收者解耦。
EventBus文檔:http://greenrobot.org/eventbus/documentation
EventBus源碼: https://github.com/greenrobot/EventBus.git
EventBus框架中涉及四個成分
訂閱者,發布者,訂閱事件,事件總線 它們的關系可以用官方的圖表示:

EventBus1.0
首先你要為你的app添加依賴庫:
compile 'org.simple:androideventbus:1.0.5.1'
Activity中使用有三部:
1.注冊(onCreate方法下)
EventBus.getDefault().register(this);
2.監聽(自定義方法即可)
@Subscriber(tag = Utils.RESULTDATA) public void resultData(String title) { username.setText(title); }
3.解除注冊(onDestroy方法下)
EventBus.getDefault().unregister(this);
然后就是發布事件讓監聽事件接受通信信息,在更新UI操作,相關代碼如下:
Activity
/**** * eventbus通信 * 1.0版本 */ public class MainActivity extends AppCompatActivity implements View.OnClickListener{ EditText username; EditText password; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setTitle("登錄界面"); setContentView(R.layout.activity_main); EventBus.getDefault().register(this); initView(); } private void initView() { username=(EditText)findViewById(R.id.username); password=(EditText)findViewById(R.id.password); findViewById(R.id.login).setOnClickListener(this); findViewById(R.id.register).setOnClickListener(this); } /*** * (String)->這里可以是任意類型--(在返回的時候對應就行) * @param title */ @Subscriber(tag = Utils.RESULTDATA) public void resultData(String title) { username.setText(title); } //退出 @Subscriber(tag=Utils.EXIT) public void exit(boolean isFang) { if (isFang) { finish(); } } @Override public void onClick(View v) { String name=username.getText().toString(); String pwd=password.getText().toString(); switch (v.getId()) { case R.id.login: break; case R.id.register: startActivity(new Intent(MainActivity.this,RegisterActivity.class)); break; } } /*** * 解除注冊 */ @Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); } }
通信的Activity
public class RegisterActivity extends AppCompatActivity implements View.OnClickListener{ EditText username; LinearLayout linearLayout; Button register; Button exit; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.setTitle("注冊界面"); EventBus.getDefault().register(this); initView(); } private void initView() { username=(EditText)findViewById(R.id.username); linearLayout=(LinearLayout)findViewById(R.id.linear); linearLayout.setVisibility(View.GONE); register=(Button) findViewById(R.id.login); register.setText("注冊"); register.setOnClickListener(this); exit=(Button)findViewById(R.id.register); exit.setText("退出"); exit.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.login://注冊 String string=username.getText().toString(); if (TextUtils.isEmpty(string)) { Toast.makeText(getApplicationContext(),"用戶名不能為空",Toast.LENGTH_LONG).show(); } else { //發布事件 EventBus.getDefault().post(string,Utils.RESULTDATA); finish(); } break; case R.id.register://退出 EventBus.getDefault().post(true,Utils.EXIT); finish(); break; } } /*** * 解除注冊 */ @Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); } }
效果如下圖:(包含用戶名和退出的通信)

EventBus3.0
首先你要為你的app添加依賴庫:
compile 'org.greenrobot:eventbus:3.0.0'
注冊和解除注冊相同,監聽事件有所改變
@Subscribe(threadMode = ThreadMode.MAIN) public void onUserName(User user) { username.setText(user.getUsername()); }
threadMode的之有四個:
- NAIN UI主線程
- BACKGROUND 后台線程
- POSTING 和發布者處在同一個線程
- ASYNC 異步線程
也可以訂閱事件的優先級,需加參數 ,如下:
/** * priority:事件的優先級類似廣播的優先級,優先級越高優先獲得消息 * 在ui線程執行 * @param user */ @Subscribe(threadMode = ThreadMode.MAIN,priority = 100) public void onUserName(User user) { username.setText(user.getUsername()); }
除了上面一種事件外,EventBus還有一種黏性事件,意思就是先發布事件,在注冊也能監聽得到,用postSticky來發布。
EventBus.getDefault().postSticky(user);
/** * sticky。 * 方式2 */ @Subscribe(sticky = true) public void onExit(User user) { username.setText(user.getUsername()); }
EventBus3.0效果如下圖:(包含用戶名的兩種通信方式)

