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