摘要:開始實現用法實例注冊事件庫創建自定義事件并發送事件指定了特定注解的合理方法會被調用注銷事件庫基本和的有點類似。自定義注解第一個版本先不考慮事件調度模型,所以該注解目前只是作為代碼標識,為了內部處理而已。
在使用BmobSDK開發App的時候,會有很多異步回調,類似如登錄成功,插入數據成功的事件,雖然V3.5.0開始內部用rxjava去重構,也提供了rx風格的api,不過寫事件回調的方法還是比較煩,這時候你可以會用下流行的EventBus庫。下面就逐漸實現一個簡單的Demo,第一個版本,先不考慮優化和性能,線程切換之類的!
沒有事件總線庫之前你可能寫接口回調,發廣播,但是Activity和Fragment等組件交互也有點麻煩,寫起來代碼都是比較冗余的!
用了之后代碼優雅,依賴于注解,使得代碼分離開來,在需要的時候send事件,對應注解到的特定方法就會被調用到,其實類似的還有Otto這個庫。
開始實現 用法實例// 注冊事件庫 Bus.getDefault().register(this); // 創建自定義事件并發送事件 Event event = new Event(); event.setUserId("111"); Bus.getDefault().post(event); // 指定了特定注解的合理方法會被調用 @BusReceiver public void onEvent(Event event){ System.out.println("getEvent " + event.getUserId()); } // 注銷事件庫 Bus.getDefault().unRegister(this);
基本和EventBus的Api有點類似。
自定義注解@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface BusReceiver { }
第一個版本先不考慮事件調度模型,所以該注解目前只是作為代碼標識,為了內部處理而已。
注解處理 基本思路注冊事件庫的時候可以拿到該注冊類如Activty和對應改類中包涵了@BusReceiver注解的方法,并創建mMethodMap中(類型為Map
此時根據事件類型,去mMethodMap中遍歷,事件類型判斷通過就調用method.invoke()調用特定的注解方法。基本都是對reflect下的api使用,比如拿到該類的方法,判斷注解并處理等的操作!
代碼public interface IBus { void register(Object target); void unRegister(Object target); void post(Object event); } public class Bus implements IBus { // 1 reg時 把target類型 記錄 // 2 通過target類型(Class)找到含有指定@BusReceiver注解的方法 并拿到方法參數類型 以及事件類型 // mapmore// post調用 Bus需要根據發送的事件類型找到 map中含有該事件類型的target中的方法集合并調用方法 private static Bus INSTANCE = null; // 某target下的方法集合 private Map
基本的事件驅動思路就是這樣,轉換思路換來代碼的整潔,特別是App客戶端事件比較多的情況比較適合用類似的庫,不過還有一些不足,后續繼續改進:
1 沒加入調度和分發模型,指定方法在特定的線程回調;
2 方法查找的效率問題,可以放到map緩存,標準庫jdk,Android SDK中的方法是可以跳過的;
3 注解處理的效率問題,判斷符合方法的條件的順序是不是可以調整下;
4 可以適當對方法Method對象做一定的抽象;
5 還沒加入支持事件繼承;
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68825.html
摘要:自年月日首次發布以來,已經占領了互聯網。我和許多其他開發人員將他們的成功歸功于這個了不起的框架,這已經不是什么秘密了。不要驚慌,查看將它注銷掉從版本開始,默認為。彈出項目就像打開正在運行的汽車的引擎蓋,同時動態地更換引擎,使其運行速度提高。 自2013年5月29日首次發布以來,React.js已經占領了互聯網。我和許多其他開發人員將他們的成功歸功于這個了不起的框架,這已經不是什么秘密了...
摘要:也就是說通過我們自己構建來解釋是否是一個合適的路由抽象。首先,并不需要,因為如果路由中沒有給那么將會自動渲染?;旧衔覀兊穆酚芍灰P心的變化并且返回相應的即可。為了解決這個問題,需要跟蹤每一條并且當路由發生改變的時候調用。 showImg(https://segmentfault.com/img/remote/1460000008803951?w=800&h=615); 作者:Tyl...
摘要:方案由于圖標圖片比較多,而且體積很小,為了減少請求所以很多時候我們會用雪碧圖這種技術來將圖標拼湊在同一張圖片里面。你也能想到,一堆圖標的雪碧圖,修改維護會相當麻煩現在比較好的方案是使用引入圖片,小圖直接轉換成插入中。 來,干了這碗安利 寫這篇文章的目的其實就是為了安利一下我的圖標庫:iconoo,所以,開門見山,star吧少年少婦們!(這樣的我是不是應該要加個github互粉的團伙了?...
摘要:到此,和組件的代碼如下在組件中設置了數組來保存組件中的表單實例,方便接下來獲取表單實例來判斷各個表單的校驗情況并在生命周期中就綁定兩個監聽事件和用于添加和移除表單實例。 前言: 在日常使用vue開發WEB項目中,經常會有提交表單的需求。我們可以使用 iview 或者 element 等組件庫來完成相關需求;但我們往往忽略了其中的實現邏輯,如果想深入了解其中的實現細節,本文章從0到1,手...
閱讀 692·2021-11-22 09:34
閱讀 3829·2021-09-22 15:42
閱讀 1337·2021-09-03 10:28
閱讀 1078·2021-08-26 14:13
閱讀 1908·2019-08-29 15:41
閱讀 1435·2019-08-29 14:12
閱讀 3372·2019-08-26 18:36
閱讀 3313·2019-08-26 13:47