Android組件間通信機制

組件間通信機制:

1.本地廣播:

本地廣播特點:(觀察者模式的運用)

比全局廣播更快,出自於Android.support,(底層實現是handler);

僅限APP內傳播,安全性,保密性,效率遠高於全局廣播;

不支持靜態註冊;

缺陷:無法干涉傳輸途中的任何步驟。

也存在比本地廣播更加高效的通信方式:事件總線。

2.EventBus:

替代Intent,Handler,Broadcast,在Fragment,Activity,Service,Thread之間傳遞消息。

特點:開銷小,代碼優雅,解耦,。可以動態設置事件處理線程和優先級。

特別注意:onDestory中必須調用取消訂閱,強引用。內存泄漏後各種靈異事件,足以讓你找不到北,別問我咋知道的,說多了都是淚。

但是EventBus也有缺點:類似策略模式,每個事件都必須自定義一個事件類,造成事件類過多,無形中加大了維護成本。

EventBus3.0與EventBus2.x用法類似,3.0開啓索引系統後,速度遠快於2.x。

2.x運行時註解,反射耗費效率,低端手機中頻繁反射,影響性能。

3.0採用編譯時註解,Java文件編譯時,變成.class文件時,完成註解。

並且3.0還池化了對象,建立對象池,減少了反覆創建對象的開銷。

3.RxBus:

RxJava響應式編程的運用,不牽涉反射,效率更高。比監聽者模式的EventBus2.x更高效,線程調度和鏈式操作比EventBus優秀。

如果項目中引入RxJava可以考慮使用RxBus,如未引入,EventBus3.0將是更好的選擇。

4.組件化事件總線的考量:

信息容器模板需要放在一個公共位置,例如Base Module,但是通信就會依賴BaseModule,這種設計顯然不合理。違背了模塊獨立,通用的原則。每次增加其他模塊 都要修改BaseModule,耦合性太強,就算刪除模塊,可以不改BaseModule但是無用代碼 ,會使之臃腫不堪。這是目前組件化通信遇到的瓶頸問題。

兩種比較適合現階段組件化的通信方式:

4.1 ModuleBus:

ModuleBus能傳遞一些基礎類型的數據,不會影響Base模塊的架構,但是自定義的事件信息模板仍需要添加到BaseModule中才能讓其他功能模塊索引。使用方法類似EventBus。

4.2組件化架構的ModularizationArchitecture庫。

每個功能模塊中需要使用註解建立Action事件,每個Action完成一個動作,invoke只是方法名爲反射,並未用到反射,而是使用接口方式調用。參數是通過HashMap<String,String>傳遞的,無法傳遞對象。

以上兩種方法都能解決組件化中註冊事件到BaseModule的冗餘問題。

缺點在於:

  1. 無法像EventBus擁有類名索引,也無法傳遞自定義實體類到其他模塊,這樣無代碼提示,無法引導正確編寫代碼;
  2. 只能傳遞基礎數據類型和數據結構,無法傳遞class類型對象。

任何一個工具都不可能是完美的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章