使用MqttAndroidClient完成IM

  1. MQTT是什么猜嘱?

mqtt的官方文檔

http://mqtt.org/documentation

Github上有中文翻譯

https://github.com/mcxiaoke/mqtt

以上文檔均為mqtt協(xié)議的說明辈赋,沒有具體如何使用的指導罐监,深入研究協(xié)議的可以看涌献。

1. Why MQTT描孟?

某云的文檔是這樣說的

image

(原文鏈接

https://help.aliyun.com/document_detail/42419.html

反正就是愧薛,如果不想用市面上的諸如環(huán)信融云等第三方IM庫,讓后臺人員買個好點的服務器掏愁,自己做IM歇由。

2. 集成 MqttAndroidClient

image

實際上在gradle sync的時候,service包會報異常

『Error:Failed to resolve: org.eclipse.paho:org.eclipse.paho.android.service:1.1.0』

所以建議是在github上下載Android Demo果港,把整個service 包當一個單獨的module沦泌,作為jar包,編譯到你的項目中

image

service里包含了client的jar包辛掠,所以就不用去sync下載了谢谦。

推薦使用:

eclipse出品Android Demo

https://github.com/eclipse/paho.mqtt.android

2.1初始化

mqtt的生命周期不應該綁在某個activity上,建議傳getApplicationContext(),使其與整個應用共存亡。

image

初始化一個mqttClient,實際上整個應用也只需要存在一個mqttClient。

connectiOption默認構(gòu)造器屬性琅摩,userName和password找后臺要盗蟆。

image

自動重連是默認關閉的,設置開啟后预柒,會在掉線的情況下每隔1秒請求一次队塘;

設置超時,setConnectionTimeout宜鸯,timeout默認是30秒憔古;

cleanSession,默認開啟淋袖,每斷一次鸿市,就清除這個鏈接,方便后臺管理即碗。

經(jīng)調(diào)試焰情,建議關閉自動重連,在mqttCallbackExtened和MqttActionListener里做重連處理剥懒。

2.2 開始連接

image

client設置mqttCallbackExtened回調(diào)和MqttActionListener監(jiān)聽

image

mqttCallbackExtened需要實現(xiàn)的方法内舟。這里的messageArrived貌似并未響應接收的消息隊列。

重點關心以下

connectComplete

image

如果需要保持某個會話長時間保存初橘,那么在connectOption里setCleanSession為false,

image

因為業(yè)務要求验游,我這里并不需要保存長會話,斷線后就重新生成id保檐,重新訂閱耕蝉,服務器也不用管理斷線的會話,定時清理展东,減少后臺壓力赔硫。

connectionLost

之前有提到,不設置自動重練盐肃,那么應該要做手動重連的處理爪膊。

我這里先保存了斷開連接的日志,方便查錯砸王,然后setClientID----重新生成id用于建立新會話推盛,5秒后請求連接。

image
image

同樣的谦铃,在成功后訂閱主題耘成。

失敗,記錄日志,5秒后重連瘪菌。

image

問題來了:

為什么不在mqttCallBackExtend的onSuccess里訂閱主題撒会,而要在Listener里訂閱?

mqttCallBackExtend的onSuccess先被觸發(fā)师妙,

然后才走IMqttActionListener的onSuccess或onFailure

可以認為诵肛,只有后者成功走onSuccess,整個訂閱才算成功默穴。

或者說怔檩,mqttCallBackExtend著眼在client和服務器的連接是否成功,不管會話的建立是否成功蓄诽,后者重點在會話的建立薛训。(這里有點模糊,我有空再查查資料)

2.3訂閱主題

其實這里訂閱只需要設置IMqttMessageListener就可以了仑氛,

messageArrived方法處理接收到的消息乙埃,根據(jù)接收到的topic進行分類處理。

此處我是用EventBus分發(fā)所有接到的消息锯岖,在fragment或者Activity里處理對應topic

image
image

附mqtt的消息類型(messageId用來保證該條消息的唯一性膊爪,可做去重判斷)

image

在訂閱的時候,需要注意的是嚎莉,重復訂閱相同主題沒有問題米酬,且相比重新連接消耗低。

例子:

在保證不斷線的情況下趋箩,

A循環(huán)操作 訂閱赃额,取消訂閱,訂閱叫确,取消訂閱…

和循環(huán)操作 開鏈接跳芳,訂閱,取消訂閱竹勉,關連接飞盆。

同一個用戶可以同時訂閱多個主題,不同的用戶訂閱的主題不一樣次乓,

這里采取的方案是吓歇,每訂閱一個主題topic,就把這個topic存入一個list票腰,

取消訂閱則把該topic從list中移除城看,

遇到斷線需要重新連接的時候,循環(huán)訂閱該list中的主題杏慰。

image

當然测柠,mqqttClient.subscribe()提供了一次訂閱多個主題的方法炼鞠,當然也需要同時傳入多個IMqttMessageListener,這相當于要開發(fā)者同時維護幾個list(當然也可以寫個map)

image

看業(yè)務復雜度吧轰胁,這里對消息的處理比較簡單谒主,只管接收,接到就發(fā)出去赃阀。

2.4取消訂閱

image

2.5釋放資源

從搭建mqtt的準備工作就可以看出瘩将,我們用的eclipse這個demo,本質(zhì)上就是一個service凹耙,如果綁定的是某Activity,Activity被干掉肠仪,當然就has leaked了肖抱。(Service被干調(diào),但連接一直保持)

順序調(diào)用client.close –》client.unRegisterResource

敲黑板:可我干嘛要釋放這個資源呢异旧?我初始化的時候意述,綁定的就是整個應用的生命周期,service一直在后臺運行著吮蛹,接收訂閱的消息荤崇,

開發(fā)者只要關心:用戶訂閱了哪個主題,又取消訂閱了哪個主題潮针,在哪個界面處理哪個主題术荤。

image
image
image

參考鏈接:

http://lilei.work/2016/02/25/Android-Performance-Patterns-s5ep10-Profile-GPU-Rendering/

http://stackoverflow.com/questions/33451381/colors-of-profile-gpu-bars-on-android-m

https://developer.android.google.cn/studio/profile/am-gpu.html

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市每篷,隨后出現(xiàn)的幾起案子瓣戚,更是在濱河造成了極大的恐慌,老刑警劉巖焦读,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件子库,死亡現(xiàn)場離奇詭異,居然都是意外死亡矗晃,警方通過查閱死者的電腦和手機仑嗅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來张症,“玉大人仓技,你說我怎么就攤上這事∷姿” “怎么了浑彰?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長拯辙。 經(jīng)常有香客問我郭变,道長颜价,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任诉濒,我火速辦了婚禮周伦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘未荒。我一直安慰自己专挪,他們只是感情好,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布片排。 她就那樣靜靜地躺著寨腔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪率寡。 梳的紋絲不亂的頭發(fā)上迫卢,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天,我揣著相機與錄音冶共,去河邊找鬼乾蛤。 笑死,一個胖子當著我的面吹牛捅僵,可吹牛的內(nèi)容都是我干的家卖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼庙楚,長吁一口氣:“原來是場噩夢啊……” “哼上荡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起馒闷,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤榛臼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后窜司,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沛善,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年塞祈,在試婚紗的時候發(fā)現(xiàn)自己被綠了金刁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡议薪,死狀恐怖尤蛮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情斯议,我是刑警寧澤产捞,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站哼御,受9級特大地震影響坯临,放射性物質(zhì)發(fā)生泄漏焊唬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一看靠、第九天 我趴在偏房一處隱蔽的房頂上張望赶促。 院中可真熱鬧,春花似錦挟炬、人聲如沸鸥滨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽婿滓。三九已至,卻和暖如春粥喜,著一層夾襖步出監(jiān)牢的瞬間凸主,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工容客, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人约郁。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓缩挑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鬓梅。 傳聞我的和親對象是個殘疾皇子供置,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容