1、寫在前面html
還在爲時間接收而煩惱嗎?還在爲各類組件間的消息傳遞煩惱嗎?EventBus 3.0,專一於android的發佈、訂閱事件總線,讓各組件間的消息傳遞更簡單!完美替代Intent,Handler,BroadCast,接口等傳統方案。這麼優雅的功能實現,卻只有50k左右的jar包,無疑集快、小、優雅解耦於一身,目前最新版本爲3.0,與以前版本有所衝突,官方網址:https://github.com/greenrobot/EventBusandroid
2、使用簡介git
總的流程只須要4步:添加依賴=>編寫事件類=>發送事件=>接收事件並處理。github
經過一個例子說明:例子爲三個Activity,入口Activity點擊一個Button跳轉到第二個Activity,第二個Activity點擊跳轉第三個,第三個能夠發送數據讓第一個Activity接收,具體可看下面的gif圖,代碼詳見github:https://github.com/nanchen2251/EventbusDemoapp
一、添加依賴 ide
1 compile 'org.greenrobot:eventbus:3.0.0'
二、編寫事件類,這裏能夠傳遞任意類型,先來傳遞一個Object類吧佈局
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 }
User類很簡單post
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 }
三、post發送事件(這裏我是使用三個Activity,佈局只有簡單的Button和TextView,具體代碼可上github查看)this
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 }
四、訂閱者接收事件 spa
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 }
3、注意事項
一、註冊通常寫在onCreate或者onStart中,儘可能不要寫在onResume,可能出現屢次註冊,好比:
EventBusException: Subscriber class already registered to event class
二、取消註冊必定寫在onDestory,寫在onStop可能會引起異常;
三、建議註冊前先判斷一下是否已經註冊,避免重複註冊,而且註冊儘可能放在各變量初始化最後,以避免形成空指針異常;
1 if (!EventBus.getDefault().isRegistered(this)) { 2 EventBus.getDefault().register(this); 3 }
四、3.0和以前版本不兼容,如今採用註解的方法來接收事件,四種註解方式分別爲:
1) @Subscrible 對應以前的onEvent();
2) @Subscrible(threadMode = ThreadMode.ASYNC) 對應以前的onEventAsync();
3) @Subscrible(threadMode = ThreadMode.BACKGRAND) 對應以前的onEventBackground();
4) @Subscrible(threadMode = ThreadMode.MAIN) 對應以前的onEventMainThread();
五、採用註解後方法名沒有限制了,參數只有一個,和發送者post的參數對應配對,未聲明threadMode的時候默認線程模式是ThreadMode.POSTING,只有在該模式下才能夠取消線程,不然容易致使以下異常:org.greenrobot.eventbus.EventBusException: This method may only be called from inside event handling methods on the posting thread
六、一個事件不支持重複註冊,不然會報異常。
4、寫在最後
有不理解的請在評論區留言,博主一貫都是直播模式對待每一篇博客,若是你喜歡,點個推薦吧~轉載請附帶本文連接:http://www.cnblogs.com/liushilin/p/6089785.html