AndroidEventBus V1.0.4版發布啦

來源:互聯網
上載者:User

標籤:sticky   事件   eventbus   android   

如果對於AndroidEventBus不瞭解的同學請移步 AndroidEventBus的設計與實現。AndroidEventBus庫的github地址在這裡。

新版特性
  1. 支援Sticky事件;
  2. 弱引用持有訂閱者,無需手動unregister,避免記憶體泄露。
什麼是Sticky事件?

關於Sticky事件有的同學可能不是很熟悉,Sticky的意思是粘性的。在Android開發中,Sticky事件只指事件消費者在事件發布之後才註冊的也能接收到該事件的特殊類型。Android中就有這樣的執行個體,也就是Sticky Broadcast,即粘性廣播。正常情況下如果寄件者發送了某個廣播,而接收者在這個廣播發送後才註冊自己的Receiver,這時接收者便無法接收到剛才的廣播,為此Android引入了StickyBroadcast,在廣播發送結束後會儲存剛剛發送的廣播(Intent),這樣當接收者註冊完Receiver後就可以接收到剛才已經發布的廣播。這就使得我們可以預先處理一些事件,讓有消費者時再把這些事件投遞給消費者。

AndroidEventBus也提供了這樣的功能,有所不同是AndroidEventBus會儲存所有的Sticky事件,如果某個事件在不需要再儲存則需要手動進行移除。使用者通過Sticky的形式發布事件,而消費者也需要通過Sticky的形式進行註冊,當然這種註冊除了可以接收Sticky事件之外和常規的註冊功能是一樣的,其他類型的事件也會被正常處理。發布、接收Sticky事件的步驟有如下幾步 :

1、發布Sticky事件;

EventBus.getDefault().postSticky("hello");

2、 某個時刻訂閱者以Sticky的形式註冊

public class MyReceiver {    public MyReceiver() {        EventBus.getDefault().registerSticky(this);    }    @Subscriber    private void onStickyEvent(String info) {        System.out.println("接收到事件 : " + info);    }}

當在某個時刻構造MyReceiver時就會將MyReceiver對象以Sticky的形式註冊到EventBus中,此時先前發布的”hello”事件就會被MyReceiver對象接收到,因此就會執行onStickyEvent函數,在該函數中實現具體的邏輯即可。當然,不要忘了在某個時刻將MyReceiver登出,以弱引用的形式持有訂閱者的功能還沒有完成呐!整個過程就這樣結束了~

Sticky事件的運用情境

上文中我們簡單講述了Sticky事件的基本使用步驟,這裡我們以一個具體的樣本來看看Sticky事件在開發中的使用情境。

在開發過程中,我們經常需要在Activity之間傳值,我們的做法就是將資料塞到Intent中,並且為每個資料設定一個key。當我們傳遞的資料是一個實體類時,我們的這個類還需要實現序列化介面,比如Parcelable或者Serializable。例如我們需要將一個使用者物件傳遞到使用者個人資訊展示頁面。我們的常規做法是這樣的:

User.java類 :

// 實體類實現序列化public class User implements Parcelable {        String name ;        String phoneNum;        // 其他欄位省略        public User(String aName) {            name = aName ;        }        public User(Parcel in) {            super(in);            name = in.readString();            phoneNum = in.readString();        }       // 代碼省略        @Override        public void writeToParcel(Parcel dest, int flags) {            dest.writeString(name);            dest.writeString(phoneNum);        }        public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>() {        @Override        public User createFromParcel(Parcel source) {            return new User(source);        }        @Override        public User[] newArray(int size) {            return new User[size];        }    }; }

然後我們要在某個Activity中將這個使用者資料傳遞給個人資訊介面ProfileActivity。代碼如下 :

public class MainActivity extends Activity {    // 某個點擊事件    @Override     public void onClick(View v) {        User aUser = new User("Mr.Simple");        aUser.phoneNum = "123456";        // 其他資料        Intent intent = new Intent(this, ProfileActivity.class);        intent.putParcelable("user", aUser);        startActivity(intent);    }}

在某個點擊事件的處理函數中我們通過Intent將資料傳遞給ProfileActivity。我們再看看ProfileActivity從Intent中取出資料的代碼。

public class ProfileActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_profile);        // 從Bundle中擷取資料        Bundle extraBundle = getIntent().getExtras();        if (extraBundle != null) {            User user = extraBundle.getParcelable("user");        }    }}

OK,至此整個過程才算結束了。

大哥,我只是需要傳個資料啊!何苦啊!
這種方式產生了很多的樣板代碼,也讓邏輯變得更複雜,容易出錯。我們再看看使用Sticky事件的實現方式。

User.java類 :

// 實體類實現序列化public class User  {        String name ;        String phoneNum;        // 其他欄位省略        public User(String aName) {            name = aName ;        }        // 代碼省略 }

首先User類不需要實現序列化介面,避免了那些樣板代碼。然後在MainActivity中直接將User對象作為Sticky事件發布即可。

public class MainActivity extends Activity {    // 某個點擊事件    @Override     public void onClick(View v) {        User aUser = new User("Mr.Simple");        aUser.phoneNum = "123456";        // 其他資料        // 發布Sticky事件        EventBus.getDefault().postSticky(aUser);        // 跳轉到ProfileActivity頁面        Intent intent = new Intent(this, ProfileActivity.class);        startActivity(intent);    }}

最後我們看看ProfileActivity如何接收資料。

public class ProfileActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_profile);        // 以Sticky的形式註冊        EventBus.getDefault().registerSticky(this);    }    @Subscriber    private void receiveUser(User info){         // 這裡實現你的邏輯即可, info即為傳遞過來的User對象    }}

在ProfileActivity中我們將ProfileActivity自身作為訂閱者註冊到匯流排當中,此時ProfileActivity就會接收到上面發布的Sticky事件,這個事件對象就是User對象。此時就會觸發ProfileActivity 中的receiveUser函數,info參數就是Sticky事件的那個使用者資訊對象,在receiveUser中實現自己的邏輯即可。

是的!我們並沒有在onDestory中對訂閱者進行登出,也就是沒有調用EventBus的unregister()函數,這就是最新版的特性之一,也是目前唯一不需要手動登出的事件匯流排庫。

問題是不是簡單了很多~ 還有什麼情境可以使用Sticky事件呢?Sticky事件是否應該消費完之後自動移除?這些問題大家可以自行思考或者給我留言([email protected]),謝謝。

AndroidEventBus V1.0.4版發布啦

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.