1.定義乙個evnet;
public static class messageevent
2.準備觀察者
宣告和注釋你的訂閱方法,可選地指定執行緒模式
@subscribe(threadmode = threadmode.main) //比如這個就指定主線程
關於型別的解釋介紹請查閱
註冊和反註冊在你的使用中,例如在activity中
@override
public void oncreate()
@override
public void ondestroy()
3.post你的事件event
eventbus.getdefault().post(new messageevent());
4.訂閱者接收事件並處理
onevent(使用onevent來接收事件,那麼接收事件和post事件在同乙個執行緒中執行)
oneventmainthread( 使用oneventmainthread來接收事件,那麼不論post事件在哪個執行緒執行,接收事件永遠在ui執行緒執行)
oneventbackgroundthread(使用oneventbackgroundthread來接收事件,如果post事件在子執行緒執行,那麼接收事件直接在同乙個執行緒
執行,如果post事件在ui執行緒,那麼會啟動乙個子執行緒接收事件)
oneventasync(使用oneventasync接收事件,無論post事件在哪個執行緒 (ui或者子執行緒) 執行,接收事件都會在乙個新的子執行緒執行)
1.首先看下他的
這裡看到,他是用到了單例,保證eventbus物件的唯一,在看看他的建構函式
這裡面new了幾個hashmap,用來儲存訂閱者的資訊,還有幾個poster,用來在不同的執行緒中post事件的。
mainthreadposter對應的主線程接收事件
backgroundposter 某個子執行緒
asyncposter 也是對應的某個子執行緒
2.看他的register
乙個管理獲取,查詢訂閱者和訂閱者method 的物件subscribermethodfinder,之後通過反射拿到訂閱者的修飾符,方法引數等資訊,判斷了訂閱者的方法引數只能是乙個引數,並且是public修飾的,不能是static,final修飾的,否則的話丟擲異常
獲取的
method,反射方法的物件,threadmode:執行緒模式物件,eventtype事件的型別
取出method 中的eventtype,然後建立乙個subscription物件,用於存放method和訂閱者資訊的,之後將eventtype和subscriptions關聯起來,之後把subscription加入到subscriptions中,為什麼subscriptions和eventtype關聯,因為每個訂閱者的可能是不同的eventtype型別,
3.在看下post
currentpostingthreadstate這個方法獲取當前執行緒的狀態,是否是post,是否是主線程等
while (!eventqueue.isempty())
之後判斷佇列裡是否有資訊,不為空的話就獲取post
4.在看下unregister
通過訂閱者拿到所有的定義subscribedtypes,之後遍歷subscribedtypes,拿到eventtype
之後通過eventtype,獲取到訂閱者集合,拿到他的size,進行遍歷,找到這個訂閱者,是他的active是false,並且移除。
深入理解C語言 深入理解指標
關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...
mysql 索引深入理解 深入理解MySql的索引
為什麼索引能提高查詢速度 先從 mysql的基本儲存結構說起 mysql的基本儲存結構是頁 記錄都存在頁裡邊 各個資料頁可以組成乙個雙向鍊錶每個資料頁中的記錄又可以組成乙個單向鍊錶 每個資料頁都會為儲存在它裡邊兒的記錄生成乙個頁目錄,在通過主鍵查詢某條記錄的時候可以在頁目錄中使用二分法快速定位到對應...
深入理解C語言 深入理解指標
關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...