EventBus初體驗

背景:

昨天看了啓艦大神的關於EventBus的文章,很久以前的東西我居然沒使用,今天學習一下。
這裏寫圖片描述

何爲EventBus(https://github.com/greenrobot/EventBus)

官方如是說:EventBus is a publish/subscribe event bus optimized for Android.EventBus是針對Android優化的發佈/訂閱事件總線。值得一提的是這家公司也出品了GreenDao這個庫。

優點:

  1. 簡化組件間的關聯;
  2. 使你的代碼簡化;
  3. 快速;
  4. 體積小;
  5. 具有先進的特性,如交付線程、訂閱者優先級等。

使用步驟:

測試場景:從第一個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種模型:

英文點這裏
中文點這

踩過的坑:

  1. 接收消息的Activity在消息發送前必須已經註冊過,所以你切不可在startActivity(intent)後發送消息,還沒來得及註冊(如果使用粘性事件另當別論)。
  2. 不可重複註冊。

ps:如有錯誤,歡迎指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章