大家好!
首先申明一下,本人是一名初級Android程序員,剛接觸EventBus(3.0的用法)有什麼說的不對的地方還請大神指點一二。此文章是面向能力不強,對於大神級別就Easy了,廢話不多說直接進入正題。
什麼是EventBus
EventBus是一款針對Android優化的發布/訂閱事件總線。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,線程之間傳遞消息.優點是開銷小,代碼更優雅。
1.EventBus初步體驗
程序運行輸出日志如下
EventBus.getDefault().register(this); 意思是注冊當前界面所有方法
EventBus.getDefault().post("Hello EventBus"); 意思是尋找當前界面參數為一個的方法並且是被@Subscribe注解,並執行此方法。當執行發送事件post在線程1裡執行,那麼事件方法也在線程1裡執行.
聲明:定義事件方法必須是public,不能有使用修飾符否則會報錯。
2.線程模型模式
在EventBus的事件處理函數中需要指定線程模型,即指定事件處理函數運行所在的線程。EventBus中通常有四種線程模型,分別是PostThread(默認)、MainThread、BackgroundThread與Async。
PostThread:如果使用事件處理函數指定了線程模型為PostThread,那麼該事件在哪個線程發布出來的,事件處理函數就會在這個線程中運行,也就是說發布事件和接收事件在同一個線程。
MainThread:如果使用事件處理函數指定了線程模型為MainThread,那麼不論事件是在哪個線程中發布出來的,該事件處理函數都會在UI線程中執行。該方法可以用來更新UI,但是不能處理耗時操作。
BackgroundThread:如果使用事件處理函數指定了線程模型為BackgroundThread,那麼如果事件是在UI線程中發布出來的,那麼該事件處理函數就會在新的線程中運行,如果事件本來就是子線程中發布出來的,那麼該事件處理函數直接在發布事件的線程中執行。在此事件處理函數中禁止進行UI更新操作。
Async:如果使用事件處理函數指定了線程模型為Async,那麼無論事件在哪個線程發布,該事件處理函數都會在新建的子線程中執行。同樣,此事件處理函數中禁止進行UI更新操作。
接下來請看示例
輸出日志如下:
發送事件在新的一個線程中執行
輸出日志如下:
3.事件優先接收proiority使用