在即時通訊中需要不斷接收服務端的消息拦键。
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
相關文章推薦