EventBus的使用

首先來了解下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"));
            }
        });

    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容