背景:
昨天看了啓艦大神的關於EventBus的文章,很久以前的東西我居然沒使用,今天學習一下。
何爲EventBus(https://github.com/greenrobot/EventBus)
官方如是說:EventBus is a publish/subscribe event bus optimized for Android.EventBus是針對Android優化的發佈/訂閱事件總線。值得一提的是這家公司也出品了GreenDao這個庫。
優點:
- 簡化組件間的關聯;
- 使你的代碼簡化;
- 快速;
- 體積小;
- 具有先進的特性,如交付線程、訂閱者優先級等。
使用步驟:
測試場景:從第一個Activity(取名A)跳轉到第二個Activity(取名B),然後從B回到A,需要攜帶一些數據到A(當然不用EventBus也有很多解決方案,這裏只學習EventBus的優點和其它方案的缺點,開玩笑)。
代碼實現先搭建這個情形,目前和EventBus還沒有關係:
A的佈局:
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="跳轉"/>
A的代碼:
findViewById(R.id.text).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
});
B的佈局:
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="第二個界面"/>
<Button
android:id="@+id/back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:text="返回上一頁"/>
B的代碼:
findViewById(R.id.back).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
至此把場景搭建完了,此時和EventBus還沒有半毛錢關係。
EventBus出場:
定義一個類,自己隨意,我這裏是EventMessage:
public class MessageEvent {
public final String message;
public MessageEvent(String message) {
this.message = message;
}
}
在接收消息的Activity(A中)註冊和解綁和處理收到的信息:
@Override
protected void onStart() {
super.onStart();
EventBus.getDefault().register(this);//註冊
}
@Override
protected void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);//解綁
}
@Subscribe(threadMode = ThreadMode.MAIN)//4種模式;3.0之後添加註解並且可以隨便給這個方法命名,貌似之前的版本不可以
public void onMessageEvent(MessageEvent messageEvent) {
Toast.makeText(this, messageEvent.message, Toast.LENGTH_SHORT).show();//獲取消息並顯示
}
Activity(B中)發送消息:
findViewById(R.id.back).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EventBus.getDefault().post(new MessageEvent("就是測試一下EventBus"));//發送的消息
finish();
}
});
4種模型:
踩過的坑:
- 接收消息的Activity在消息發送前必須已經註冊過,所以你切不可在startActivity(intent)後發送消息,還沒來得及註冊(如果使用粘性事件另當別論)。
- 不可重複註冊。