一.EventBus概述
1.EventBus的三要素
EventBus有三個主要的元素需要我們先了解一下:
Event:事件,可以是任意類型的對象。
Subscriber:事件訂閱者,在EventBus3.0之前消息處理的方法只能限定于onEvent、onEventMainThread、onEventBackgroundThread和onEventAsync,他們分別代表四種線程模型。而在EventBus3.0之后,事件處理的方法可以隨便取名,但是需要添加一個注解@Subscribe,并且要指定線程模型(默認(rèn)為POSTING),四種線程模型下面會講到。
Publisher:事件發(fā)布者,可以在任意線程任意位置發(fā)送事件,直接調(diào)用EventBus的post(Object)方法??梢宰约簩?shí)例化EventBus對象,但一般使用EventBus.getDefault()就好了,根據(jù)post函數(shù)參數(shù)的類型,會自動調(diào)用訂閱相應(yīng)類型事件的函數(shù)。
2.EventBus的四種ThreadMode(線程模型)
EventBus3.0有以下四種ThreadMode:
POSTING(默認(rèn)):如果使用事件處理函數(shù)指定了線程模型為POSTING,那么該事件在哪個線程發(fā)布出來的,事件處理函數(shù)就會在這個線程中運(yùn)行,也就是說發(fā)布事件和接收事件在同一個線程。在線程模型為POSTING的事件處理函數(shù)中盡量避免執(zhí)行耗時操作,因?yàn)樗鼤枞录膫鬟f,甚至有可能會引起ANR。
MAIN:事件的處理會在UI線程中執(zhí)行。事件處理時間不能太長,長了會ANR的。
BACKGROUND:如果事件是在UI線程中發(fā)布出來的,那么該事件處理函數(shù)就會在新的線程中運(yùn)行,如果事件本來就是子線程中發(fā)布出來的,那么該事件處理函數(shù)直接在發(fā)布事件的線程中執(zhí)行。在此事件處理函數(shù)中禁止進(jìn)行UI更新操作。
ASYNC:無論事件在哪個線程發(fā)布,該事件處理函數(shù)都會在新建的子線程中執(zhí)行,同樣,此事件處理函數(shù)中禁止進(jìn)行UI更新操作。
二.EventBus的基本用法
1.自定義一個事件類(相當(dāng)于我們平常所用的bean類)
public class MessageEvent { ... }