Android開源庫——EventBus使用教程

Charming本尊發表於2018-01-04

前言

EventBus這個開源庫相信很多Android開發者都用過,它是greenrobot出產的,greenrobot的厲害就不用我多說了吧,它還出產過比較出名的資料庫操作開源庫greenDAO。
Android傳統的訊息傳遞方式一般是通過Intent、Handler、BroadcastReceiver等等來進行的,這些方式也算是簡單易用,但也有許多缺點,比如說在進行訊息傳遞時需要寫大量的模板程式碼,程式碼耦合度高,而EventBus的誕生就完美解決了這些問題,它的原理是傳送事件到事件匯流排,然後根據事件型別來匹配相應訂閱者的訂閱方法,用一張圖簡單說明

EventBus原理圖

簡單列舉一下它的優點

  • 簡單有效:簡單兩句程式碼就可以實現事件傳遞功能,並且訂閱者不知道傳送者是誰,降低耦合
  • 高效能:EvnetBus針對Android平臺進行了優化
  • 註解:通過@Subscribe註解訂閱方法,同時避免了非常耗時的執行時註解反射
  • 執行緒:主執行緒和後臺執行緒都可以傳遞事件

這一篇就主要講解EventBus的基本使用方式,比較簡單,下一篇講解EventBus的高階用法

使用方式

依賴

專案中依賴EventBus庫,這裡通過gradle依賴的方式,使用的是最新版本

compile 'org.greenrobot:eventbus:3.1.1'
複製程式碼

想要了解詳細的使用方式和官方文件,請看EventBus的Github,傳送門:https://github.com/greenrobot/EventBus

實現步驟

使用方式非常簡單,可分為三點

  1. 需要接受事件的頁面註冊EventBus
  2. 通過EventBus傳送事件,相關頁面接收事件並處理
  3. 頁面銷燬,反註冊EventBus

程式碼實現

先來看一下實現效果

實現效果

註冊

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mTextView = findViewById(R.id.tv);
    findViewById(R.id.btn_jump).setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(MainActivity.this, SecondActivity.class);
            startActivity(intent);
        }
    });

    // 註冊該頁面為訂閱者
    EventBus.getDefault().register(this);
}
複製程式碼

設定按鈕監聽,點選跳轉,最後一句註冊該頁面為訂閱者,看一下訂閱方法

@Subscribe(threadMode = ThreadMode.MAIN)
public void onUpdateUIEvent(UpdateUIEvent updateUIEvent) {
    mTextView.setText("陳奕迅只有一個");
}
複製程式碼

在MainActivity定義一個方法,通過@Subscribe註解訂閱方法,接收UpdateUIEvent作為引數,意思是,在該頁面註冊成為訂閱者之後,當別處傳送UupdateUIEvent事件時,這個訂閱方法就會接收到事件並處理,此處的做法是更新TextView顯示的文字。UpdateUIEvent是自定義的一個事件類,名字可以隨便起,threadMode表示訂閱事件執行在哪個執行緒,這裡指定主執行緒。

傳送事件

點選跳轉之後,來到SecondActivity,看程式碼

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_second);

    findViewById(R.id.btn_send).setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(SecondActivity.this, "滋醒你~~~", Toast.LENGTH_SHORT).show();
            // 傳送事件
            EventBus.getDefault().post(new UpdateUIEvent());
        }
    });
}
複製程式碼

設定按鈕監聽,onClick方法裡post一個事件,該事件正是UpdateUIEvent,這也意味著MainActivity的訂閱方法onUpdateUIEvent(UpdateUIEvent)會接收到該事件,結合圖來看確實是如此。

反註冊

當銷燬頁面時,也就意味著該頁面不需要再接收事件,可以在onDestroy中反註冊EventBus

    @Override
    protected void onDestroy() {
        EventBus.getDefault().unregister(this);
        super.onDestroy();
    }
複製程式碼

到這裡可能很多人會問:實際的開發中有哪些場景是適合用EventBus來實現的呢,我舉個簡單地例子:比如說一開始使用者未登入,而當使用者登入時,需要更新非前臺頁面的一些頁面資訊,以便在使用者在返回這些頁面時立馬看到更新的效果,這時候可以使用EventBus來進行post更新事件達到靜默更新的效果。

最後附上完整原始碼,xml就不貼了
MainActivity:

public class MainActivity extends AppCompatActivity {

    private TextView mTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main);
        mTextView = findViewById(R.id.tv);
        findViewById(R.id.btn_jump).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                startActivity(intent);
            }
        });

        // 註冊該頁面為訂閱者
        EventBus.getDefault().register(this);
    }

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

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onUpdateUIEvent(UpdateUIEvent updateUIEvent) {
        mTextView.setText("陳奕迅只有一個");
    }
}
複製程式碼

SecondActivity:

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        findViewById(R.id.btn_send).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(SecondActivity.this, "滋醒你~~~", Toast.LENGTH_SHORT).show();
                // 傳送事件
                EventBus.getDefault().post(new UpdateUIEvent());
            }
        });
    }
}
複製程式碼

總結

好了,基本使用大致如上,非常簡單,相信大部分同學都用過了,沒用過的同學看了之後應該也有個大致的瞭解了。下一篇來點有意思的,講解EventBus的高階用法。
下一篇:Android開源庫——EventBus高階用法

歡迎關注

個人微信公眾號:Charming寫字的地方

Github:https://github.com/CharmingWhttps://github.com/CharmingW

感謝閱讀!

相關文章