首先來了解下EventBus
EventBus是Android下高效的發布/訂閱事件總線機制。作用是可以代替傳統的Intent,Handler,Broadcast或接口函數在Fragment,Activity,Service,線程之間傳遞數據,執行方法。特點是代碼簡潔,是一種發布訂閱設計模式(Publish/Subsribe),或稱作觀察者設計模式。
接下來看下EventBus的使用步驟:
第1步: 注冊和反注冊.
EventBus.getDefault().register(this); //在onCreate()中執行
EventBus.getDefault().unregister(this);//在onDestory()中執行
第2步:注冊事件類
//可以定義包含成員變量的事件, 用來傳遞參數,也可以不包含成員變量,和成員 方法
public class MsgEvent {
public String jsonData;
public MsgEvent(String jsonData) {
this.jsonData = jsonData;
}
}
第3步:注冊一個方法,用于接收事件.
方法名可以自定義,方法中的參數必須是自定義的事件類,否則該方法不會被調用,方法還須使用注解@Subscribe,注解不同,方法調用也不同,具體如下:
@Subscribe(threadMode = ThreadMode.Main) //在ui線程執行public void onUserEvent(MsgEvent event) {}
@Subscribe(threadMode = ThreadMode.Background) //在后臺線程執行public void onUserEvent(MsgEvent event) {}
@Subscribe(threadMode = ThreadMode.Async) //強制在后臺執行public void onUserEvent(MsgEvent event) {}
@Subscribe(threadMode = ThreadMode.PostThread) //默認方式, 在發送線程執行public void onUserEvent(MsgEvent event) {}
第4步: 發送事件
EventBus.getDefault().post(new ClassEvent());
了解了EventBus的之后來看一個在項目中的應用場景。在商城模塊中通常會用到購物車,如果購物車不為空時,購物車的圖標上往往會有個顯示的小紅點,當清空購物車時小紅點消失。如下圖所示:
20160907003238504.gif
其實這個功能實現的是兩個Activity之間的通信,可以實現這種效果的方式有很多,比如可以使用廣播實現,也可以使用接口回調實現,今天來主要來看看如何使用EventBus實現這種效果。 先貼上EventBus的源碼地址:https://github.com/greenrobot/EventBus 使用步驟如下: 1.引入gradle 依賴:
compile 'org.greenrobot:eventbus:3.0.0'
1
2.在MainActivity中對EventBus做注冊和反注冊操作,并注冊事件方法,該方法接收到事件后設置小圓點隱藏,并彈出Toast的操作。
public class MainActivity extends AppCompatActivity {
RelativeLayout mRelativeLayout;
ImageView mImageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRelativeLayout = (RelativeLayout) findViewById(R.id.rl_mall_buy_show_shopCart);
mImageView = (ImageView) findViewById(R.id.iv_mall_buy_show_shopCart_dot);
// 注冊EventBus
EventBus.getDefault().register(this);
// 為購物車圖標設置監聽,跳轉到另一個activity
mRelativeLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(getApplication(), ShopCartActivity.class);
startActivity(intent);
}
});
}
/**
* 在注冊了的Activity中,聲明處理事件的方法
*
* @param csc
*/
@Subscribe(threadMode = ThreadMode.MAIN) //注冊一個在Ui線程執行的方法,用于接收事件
public void clearedShopCart(ClearShopCart csc) {//參數必須是ClearShopCart類型, 否則不會調用此方法
String msg = csc.getMsg();
Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
mImageView.setVisibility(View.INVISIBLE);
}
@Override
protected void onDestroy() {
super.onDestroy();
// 反注冊
EventBus.getDefault().unregister(this);
}
}
3.自定義一個事件類,如下:
package com.example.smily.eventbus2;
/**
* Created by zhpan on 2016/9/6.
*/
public class ClearShopCart {
String Msg;
public ClearShopCart(String Msg) {
this.Msg=Msg;
}
public String getMsg(){
return Msg;
}
}
4.在購物車的界面點擊按鈕清空購物車并發送一個購物車為空的事件
public class ShopCartActivity extends AppCompatActivity {
private Button mButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_shop_cart);
mButton= (Button) findViewById(R.id.btn_shop_cart);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//點擊清空購物車按鈕時,調用發送事件
EventBus.getDefault().post(new ClearShopCart("shopcart was cleared"));
}
});
}
}