前言
EventBus這個開源庫相信很多Android開發者都用過,它是greenrobot出產的,greenrobot的厲害就不用我多說了吧,它還出產過比較出名的資料庫操作開源庫greenDAO。
Android傳統的訊息傳遞方式一般是通過Intent、Handler、BroadcastReceiver等等來進行的,這些方式也算是簡單易用,但也有許多缺點,比如說在進行訊息傳遞時需要寫大量的模板程式碼,程式碼耦合度高,而EventBus的誕生就完美解決了這些問題,它的原理是傳送事件到事件匯流排,然後根據事件型別來匹配相應訂閱者的訂閱方法,用一張圖簡單說明
簡單列舉一下它的優點
- 簡單有效:簡單兩句程式碼就可以實現事件傳遞功能,並且訂閱者不知道傳送者是誰,降低耦合
- 高效能:EvnetBus針對Android平臺進行了優化
- 註解:通過@Subscribe註解訂閱方法,同時避免了非常耗時的執行時註解反射
- 執行緒:主執行緒和後臺執行緒都可以傳遞事件
這一篇就主要講解EventBus的基本使用方式,比較簡單,下一篇講解EventBus的高階用法
使用方式
依賴
專案中依賴EventBus庫,這裡通過gradle依賴的方式,使用的是最新版本
compile 'org.greenrobot:eventbus:3.1.1'
複製程式碼
想要了解詳細的使用方式和官方文件,請看EventBus的Github,傳送門:https://github.com/greenrobot/EventBus
實現步驟
使用方式非常簡單,可分為三點
- 需要接受事件的頁面註冊EventBus
- 通過EventBus傳送事件,相關頁面接收事件並處理
- 頁面銷燬,反註冊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高階用法