前言
EventBus這個開源庫相信很多Android開發(fā)者都用過瓮顽,它是greenrobot出產的垛贤,greenrobot的厲害就不用我多說了吧,它還出產過比較出名的數據庫操作開源庫greenDAO趣倾。
Android傳統(tǒng)的消息傳遞方式一般是通過Intent、Handler某饰、BroadcastReceiver等等來進行的儒恋,這些方式也算是簡單易用,但也有許多缺點黔漂,比如說在進行消息傳遞時需要寫大量的模板代碼诫尽,代碼耦合度高,而EventBus的誕生就完美解決了這些問題炬守,它的原理是發(fā)送事件到事件總線牧嫉,然后根據事件類型來匹配相應訂閱者的訂閱方法,用一張圖簡單說明
簡單列舉一下它的優(yōu)點
- 簡單有效:簡單兩句代碼就可以實現(xiàn)事件傳遞功能,并且訂閱者不知道發(fā)送者是誰酣藻,降低耦合
- 高性能:EvnetBus針對Android平臺進行了優(yōu)化
- 注解:通過@Subscribe注解訂閱方法曹洽,同時避免了非常耗時的運行時注解反射
- 線程:主線程和后臺線程都可以傳遞事件
這一篇就主要講解EventBus的基本使用方式,比較簡單辽剧,下一篇講解EventBus的高級用法
使用方式
依賴
項目中依賴EventBus庫送淆,這里通過gradle依賴的方式,使用的是最新版本
compile 'org.greenrobot:eventbus:3.1.1'
想要了解詳細的使用方式和官方文檔怕轿,請看EventBus的Github偷崩,傳送門:https://github.com/greenrobot/EventBus
實現(xiàn)步驟
使用方式非常簡單,可分為三點
- 需要接受事件的頁面注冊EventBus
- 通過EventBus發(fā)送事件撞羽,相關頁面接收事件并處理
- 頁面銷毀阐斜,反注冊EventBus
代碼實現(xiàn)
先來看一下實現(xiàn)效果
注冊
@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);
}
設置按鈕監(jiān)聽,點擊跳轉诀紊,最后一句注冊該頁面為訂閱者谒出,看一下訂閱方法
@Subscribe(threadMode = ThreadMode.MAIN)
public void onUpdateUIEvent(UpdateUIEvent updateUIEvent) {
mTextView.setText("陳奕迅只有一個");
}
在MainActivity定義一個方法,通過@Subscribe注解訂閱方法渡紫,接收UpdateUIEvent作為參數到推,意思是,在該頁面注冊成為訂閱者之后惕澎,當別處發(fā)送UupdateUIEvent事件時莉测,這個訂閱方法就會接收到事件并處理,此處的做法是更新TextView顯示的文本唧喉。UpdateUIEvent是自定義的一個事件類捣卤,名字可以隨便起,threadMode表示訂閱事件運行在哪個線程八孝,這里指定主線程董朝。
發(fā)送事件
點擊跳轉之后,來到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();
// 發(fā)送事件
EventBus.getDefault().post(new UpdateUIEvent());
}
});
}
設置按鈕監(jiān)聽子姜,onClick方法里post一個事件,該事件正是UpdateUIEvent楼入,這也意味著MainActivity的訂閱方法onUpdateUIEvent(UpdateUIEvent)
會接收到該事件哥捕,結合圖來看確實是如此。
反注冊
當銷毀頁面時嘉熊,也就意味著該頁面不需要再接收事件遥赚,可以在onDestroy中反注冊EventBus
@Override
protected void onDestroy() {
EventBus.getDefault().unregister(this);
super.onDestroy();
}
到這里可能很多人會問:實際的開發(fā)中有哪些場景是適合用EventBus來實現(xiàn)的呢,我舉個簡單地例子:比如說一開始用戶未登錄阐肤,而當用戶登錄時凫佛,需要更新非前臺頁面的一些頁面信息讲坎,以便在用戶在返回這些頁面時立馬看到更新的效果,這時候可以使用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();
// 發(fā)送事件
EventBus.getDefault().post(new UpdateUIEvent());
}
});
}
}
總結
好了,基本使用大致如上厚满,非常簡單府瞄,相信大部分同學都用過了,沒用過的同學看了之后應該也有個大致的了解了碘箍。下一篇來點有意思的遵馆,講解EventBus的高級用法
下一篇:Android開源庫——EventBus高級用法