Android-IM消息接收事件之EventBus的應用

在即時通訊中需要不斷接收服務端的消息拦键。

JMessage提供了Event來匹配本地和服務端的消息接收侨艾。

在即時通訊項目中需要大量用到消息接收事件虏肾。所以結合項目簡單分析下其實現(xiàn)的原理和過程侣灶。

事件接收類的注冊

JMessageClient.registerEventReceiver(Object receiver);
JMessageClient.registerEventReceiver(Object receiver, int priority);

參數(shù)說明
Object receiver 消息接收類對象
int priority 定義事件接收者接收事件的優(yōu)先級锰茉,默認值為0,優(yōu)先級越高將越先接收到事件恕曲。(優(yōu)先級只對同一個線程模式中的接收者有效)

事件接收類的解綁

JMessageClient.unRegisterEventReceiver(Object receiver);

事件接收

注冊事件接收類之后鹏氧,需要在消息接收類中實現(xiàn)如下方法來接收對應消息。sdk將根據(jù)實現(xiàn)方法的方法名來區(qū)分不同的線程模式佩谣,常用的線程模式有onEvent(默認線程模式)和onEventMainThread(主線程模式)兩種把还。
可以通過定義不同類型的參數(shù),來接收不同種類的事件
1茸俭、默認線程(子線程)模式

public void onEvent(EventEntity event){
  //do your own business
}

方法體將在默認線程(子線程)中被調用吊履, 可以用來處理耗時操作。
參數(shù)定義
EventEntity event 事件對象瓣履。( 定義不同類型參數(shù)可以接收不同種類事件率翅,具體用法可以參考“示例代碼“。)
2袖迎、主線程模式

public void onEventMainThread(EventEntity event){
  //do your own business
}
源碼

跟蹤進入注冊事件冕臭,發(fā)現(xiàn)其實注冊事件是通過EventBus來完成

    public static void registerEventReceiver(Object var0, int var1) {
        if(var0 != null) {
            if(!EventBus.getDefault().isRegistered(var0)) {
                EventBus.getDefault().register(var0, var1);
            } else {
                j.h(TAG, z[19] + var0);
            }
        } else {
            j.j(TAG, z[20]);
        }
    }

    public static void unRegisterEventReceiver(Object var0) {
        if(var0 != null) {
            EventBus.getDefault().unregister(var0);
        } else {
            j.j(TAG, z[20]);
        }
    }
那么EventBus到底是個什么東西?

GreenDao和EventBus同屬于一個開發(fā)者燕锥。
但是EventBus在GitHub的訂閱量是GreenDao的兩倍之多辜贵。可見應用之廣泛归形,已經使用過GreenDao的開發(fā)者相信已經體會到了他的強大托慨。

關于EventBus:

Android優(yōu)化的事件總線,簡化了活動暇榴,片段厚棵,線程,服務等之間的通信蔼紧。較少的代碼婆硬,更好的質量。

原理

同樣在JMessage中奸例,也使用了EventBus作為事件接收的方法彬犯。

按照EventBus的使用方法,必須要做的三件事就是:
定義事件查吊、消息訂閱者谐区、發(fā)送事件。

1逻卖、定義事件

用于消息的解析或者也可以說是消息的事件分類宋列。
JMessage中已經定義了好了多個消息事件,用于即時通訊的事件處理评也。所以我們只需要去理解和應用炼杖。

常用的有:

  • MessageEvent 消息事件
  • MessageRetractEvent 撤回消息事件
  • ContactNotifyEvent 好友通知事件
  • ConversationRefreshEvent 消息漫游事件
  • OfflineMessageEvent 離線消息事件

定義消息示例代碼:

public class MessageRetractEvent {
    private Conversation conversation;
    private Message message;

    public MessageRetractEvent(Conversation var1, Message var2) {
        this.message = var2;
        this.conversation = var1;
    }

    public Conversation getConversation() {
        return this.conversation;
    }

    public Message getRetractedMessage() {
        return this.message;
    }
}

2戈鲁、 消息訂閱者

在任何收到任何消息,并且想要對消息做處理之前嘹叫,都需要先注冊消息事件,
一般是在生命周期開始的地方注冊诈乒,在結束的地方銷毀罩扇。
這里用的方法都是JMessage封裝后的,原始請參考EventBus官方文檔
比如:

public void onStart() {
    super.onStart();
    //注冊
    JMessageClient.registerEventReceiver(this);
}
 
        @Override
    protected void onDestroy() {
    super.onDestroy();
    //銷毀
    JMessageClient.unRegisterEventReceiver(this);
    }

訂閱者還需要一個消息接收的方法怕磨,用來匹配接收事件喂饥,所有的消息的操作都必須在注冊了接收事件之后。

方法名是自定義的肠鲫,在使用的時候要注意方法名的匹配员帮,否則無法接收到消息。

在3.0以后使用了注解的方式导饲,3.0之前必須要以onEvent為開頭定義類捞高。
所以從JMessage的方法定義來看,顯然不是最新的渣锦。
建議在自己項目中使用的最新的EventBus

// 主線程
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(MessageEvent event) {
    Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show();
}
 
// 子線程
@Subscribe
public void onEvent(SomeOtherEvent event) {
    doSomethingWith(event);
}

3硝岗、發(fā)布者

如果直接使用EventBus,雖然能實現(xiàn)消息發(fā)送袋毙,但是對于復雜的消息分類無法區(qū)分型檀,并且消息對話需要依賴服務端的實現(xiàn)。

EventBus.getDefault().post(new MessageEvent(0,"",message1));

所以只能用

JMessageClient.sendMessage(message1);
其它應用

上面只是對于在即時通訊中結合JMessage來簡單了解EventBus的消息傳遞听盖。

其他應用的地方還有:

  • 用于線程間的通訊代替handler或用于組件間的通訊代替Intent
  • 廣泛用于團購,商城,社交等應用,比如易大師APP,易宸鋒Application...
    ---------------來自百度百科

項目中引入EventBus的方法:

compile 'org.greenrobot:eventbus:3.0.0'

然后可以參照上面的使用步驟進行測試胀溺。


項目地址:https://github.com/wapchief/Android-IM

相關文章推薦

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末皆看,一起剝皮案震驚了整個濱河市仓坞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌悬蔽,老刑警劉巖扯躺,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蝎困,居然都是意外死亡录语,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門禾乘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來澎埠,“玉大人,你說我怎么就攤上這事始藕∑盐龋” “怎么了氮趋?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長江耀。 經常有香客問我剩胁,道長,這世上最難降的妖魔是什么祥国? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任昵观,我火速辦了婚禮,結果婚禮上舌稀,老公的妹妹穿的比我還像新娘啊犬。我一直安慰自己,他們只是感情好壁查,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布觉至。 她就那樣靜靜地躺著,像睡著了一般睡腿。 火紅的嫁衣襯著肌膚如雪语御。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天席怪,我揣著相機與錄音沃暗,去河邊找鬼。 笑死何恶,一個胖子當著我的面吹牛孽锥,可吹牛的內容都是我干的。 我是一名探鬼主播细层,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼惜辑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了疫赎?” 一聲冷哼從身側響起盛撑,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎捧搞,沒想到半個月后抵卫,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡胎撇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年介粘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晚树。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡姻采,死狀恐怖,靈堂內的尸體忽然破棺而出爵憎,到底是詐尸還是另有隱情慨亲,我是刑警寧澤婚瓜,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站刑棵,受9級特大地震影響巴刻,放射性物質發(fā)生泄漏。R本人自食惡果不足惜蛉签,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一冈涧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧正蛙,春花似錦、人聲如沸营曼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蒂阱。三九已至锻全,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間录煤,已是汗流浹背鳄厌。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留妈踊,地道東北人了嚎。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像廊营,于是被迫代替她去往敵國和親歪泳。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內容