【熱門技術】EventBus 3.0,讓事件訂閱更簡單,今後告別組件消息傳遞煩惱~

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

相關文章
相關標籤/搜索