Android EventBus 3.0 相見恨晚

719457222 8年前發布 | 20K 次閱讀 Android EventBus Android開發 移動開發

為什么要用EventBus?它是干什么用的?

EventBus是什么

EventBus是一個Android端優化的publish/subscribe消息總線,簡化了應用程序內各組件間、組件與后臺線程間的通信。

這樣一個簡單的概念,可能讓你不足以感受到EventBus的魅力。我們來思考一下下面這些情況。

使用購物類APP時,我們在商品詳情頁將商品加入購物車時,底部tab欄的購物車tab右上角的小數字也同步發生了變化。

面對這樣的需求,一般情況下都是在詳情頁中提供一個接口,在tab欄所在的Activity(或者是Fragment)中注冊這個接口,當點擊事件發生是,回調這個接口,更新tab欄的內容。甚至有時候,由于我們的應用會是Activity+多個fragment 的組合,可能需要多個接口經過層層傳遞,才能實現某些在產品經理看來很簡單的UI更新。

大部分APP在用戶完成用戶登錄操作后,需要在返回界面同步更新用戶信息。

這個時候,我們一般會在返回界面的onActivityResult方法中,通過requestCode及resultCode做出種種判斷,最后在確認用戶登錄成功的情況下,請求用戶信息完成UI的更新,這種體驗其實是非常不好,作為一個用戶希望的是,登錄成功的同時完成用戶信息的更新。

當然上面兩種情況,用BroadcastReceiver實現,也是完全可以的,肯能會相對簡單一些,但是從整體性能來說,這樣是不好的;再者古人云,殺雞焉用牛刀!!!

而EventBus的出現,很好的解決了這些讓我們頭疼的問題。首先就用一個簡單的列子來實現一下用戶登錄信息異步更新的情況。

EventBus 3.0 使用Demo

這里用兩個Activity簡單的模擬常見的用戶登錄。效果圖如下

登錄

用戶信息界面

public class FirstActivity extends AppCompatActivity {
    private Button btn;
    private Context mContext;
    //User Info
    private TextView userName;
    private ImageView usreImg;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mContext = this;
    EventBus.getDefault().register(mContext);
    InitView();

}

private void InitView() {
    setContentView(R.layout.activity_first);
    userName = (TextView) findViewById(R.id.userName);
    usreImg = (ImageView) findViewById(R.id.userImg);
    btn = (Button) findViewById(R.id.button);
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startActivity(new Intent(mContext, SecondActivity.class));
        }
    });
}

@Subscribe
public void onUserEvent(UserEvent event) {
    userName.setText("用戶名:" + event.nameStr);
    Glide.with(mContext).load(event.imgUrl).into(usreImg);

}

@Override
protected void onDestroy() {
    EventBus.getDefault().unregister(mContext);
    super.onDestroy();
}

}</code></pre>

用戶登錄界面

public class SecondActivity extends AppCompatActivity {
    private Context mContext;
    private Button btn;
    private EditText name;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mContext=this;
    setContentView(R.layout.activity_second);
    name = (EditText) findViewById(R.id.name);
    findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //測試數據
            String userImg = "http://img2.imgtn.bdimg.com/it/u=262221958,4109901128&fm=21&gp=0.jpg";
            //這里只是為了方便測試,隨便寫的登錄邏輯
            String userName="";
            if(!TextUtils.isEmpty(name.getText().toString())){
                userName = name.getText().toString();
                UserEvent userEvent = new UserEvent(userName, userImg);
                EventBus.getDefault().post(userEvent);
            }else {
                //不再發送事件Event
                Toast.makeText(mContext,"登錄失敗",Toast.LENGTH_SHORT).show();
            }

            finish();
        }
    });

}

}</code></pre>

UserEvent 類

public class UserEvent {
    public final String nameStr;
    public final String imgUrl;

public UserEvent(String nameStr, String imgUrl) {
    this.nameStr = nameStr;
    this.imgUrl = imgUrl;
}

}</code></pre>

這里可以看到沒有Handler,沒有onActivityResult的判斷,沒有沒有任何接口。就實現了如gif圖中所示效果。

接下來,就總結一下如何使用EventBus3.0 。

EventBus 3.0 使用步驟

1.首先我們需要將EventBus添加到我們的項目中。在AndroidStudio中我們可以在gradle里面直接配置即可。

compile 'org.greenrobot:eventbus:3.0.0'

2.創建一個事件類(這個類似于JavaBean),就是上面的UserEvent類。

這里的Demo只是舉例說明簡單用法,實際中可以根據需要創建不同的事件類

3.注冊

  EventBus.getDefault().register(mContext);

4.訂閱(響應事件方法)

@Subscribe
    public void onUserEvent(UserEvent event) {
        userName.setText("用戶名:" + event.nameStr);
        Glide.with(mContext).load(event.imgUrl).into(usreImg);

}</code></pre> 

這里的注解@Subscribe 很關鍵,表明這個方法為訂閱者,這個方法的名字也已經不在重要了(相對于以前的版本來說),在這個方法里,我們實現了UI更新,將用戶信息更新出來。

5.分發事件

UserEvent userEvent = new UserEvent(userName, userImg);
                    EventBus.getDefault().post(userEvent);

6.解除注冊

EventBus.getDefault().unregister(mContext);

這里僅從一個最簡單的Demo,了解了一下EventBus是多么的神奇。此處沒有網絡請求,post方法也是在主線程中,所以默認情況下相應事件方法onUserEvent也會在主線程中執行。實際上onUserEvent方法在注解中還是需要添加參數的。

好了,這里就簡單了解一下EventBus3.0 ,下篇文章就其使用方法深入了解一下。


來自:http://www.jianshu.com/p/be963f80f309
 

 

 本文由用戶 719457222 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!