Android 自己開發的消息事件小項目DBus


CSDN地址:http://blog.csdn.net/fesdgasdgasdg/article/details/79121783
GitHub地址:https://github.com/mengzhinan/DBus


DBus一個簡易、高效的消息框架。沒看過EventBus的源碼,但是個人感覺此項目夠簡潔高效、易懂易用!


DBus項目突出的特點:
1、注冊消息事件的類可以是任意類(可能別人的項目也是),不限定是Activity等特殊的類。<br/>
只要你保證register和unRegister方法成對調用。<br/>
否則DBus會一直持有此對象引用,可能會引起內存泄漏。<br/>


2、支持使用特定方法名的函數接收消息;支持通過注解的方式標識某方法,使其變成消息接收的方法。<br/>
如果方法前面有@DBusInject()注解,則此方法被當做DBus的注解方法處理;<br/>
如果沒有發現@DBusInject()注解,則在根據方法名限定規則來檢查是否符合要求;<br/> 
方法名限定規則為以onUIEvent開頭或者onThreadEvent開頭,分別表示在主線程和子線程接收消息的方法。<br/>


3、使用方法名限定的方式,記住如下限定規則:<br/>
 a、方法名只能是以onUIEvent或onThreadEvent開頭;<br/>
 b、如果方法名以onUIEvent開頭,表明此方法的執行是在UI線程,可以更新UI控件;<br/>
 c、如果方法名以onThreadEvent開頭,表明此方法是在子線程執行的,不可更新UI,但可做耗時操作;<br/>
 d、方法只能有一個參數。並且方法的參數類型必須是DData類型,不管消息發送處傳遞的是DData類還是子類對象;<br/>
 e、父類或接口的方法無效,必須是當前類里面定義的方法。<br/>


示例方法:<br/>
private void onUIEventXXX(DData data){<br/>


}<br/>
當然,建議的寫法是:<br/>
public void onUIEventXXX(DData data){<br/>
  //公共,無返回值<br/>
}<br/>


以下是非限定條件:<br/>
 a、方法的修飾符任意,可以是友好的、public、private、protected、static、final等;<br/>
 b、方法的返回值任意,可以是void、int、String等;<br/>
 c、上面說了方法名限定開頭,但不限定結尾,比喻可以是onUIEventForVideo(DData data)。<br/>
4、使用注解方式,有以下規則:<br/>
 a、必須在方法前面設置注解@DBusInject(),注解有兩個參數port和thread。<br/>
    port:為必填項,參數值自定義設置。如果此方法的注解port值與發送處DData對象的port值一致,才能收到發送的消息。<br/>
    thread:選填項,參考DThreadType常量值,參數值為0、1和2,分別代表主線程、當前子線程和新的子線程。<br/>
即此方法是在UI線程還是在子線程執行。默認值為0,在主線程執行,即可以更新UI控件。<br/>
 b、方法只能有一個參數。並且方法的參數類型必須是DData類型,不管消息發送處傳遞的是DData類還是子類對象。(同上)<br/>
 c、父類或接口的方法無效,必須是當前類里面定義的方法。(同上)<br/>
    


以下是非限定條件:<br/>
 a、[亮點]方法名任意;比喻haha(DData data);<br/>
 b、方法的修飾符任意,可以是友好的、public、private、protected、static、final等;(同上)<br/>
 c、方法的返回值任意,可以是void、int、String等;(同上)<br/>


示例方法:<br/>
@DBusInject(port = 1, thread = DThreadType.CURRENT_CHILD_THREAD)<br/>
private static int haha(DData data){<br/>
  return 23;<br/>
}<br/>
當然,建議的寫法是:<br/>
@DBusInject(port = 1)<br/>
public void updateTextView(DData data){<br/>
  //公共,無返回值,方法名有意義,默認在UI線程執行<br/>
}


DBus項目環境集成:
這個應該不用說,做過android的朋友都知道。<br/>
 1、把DBus源碼搬進你的項目中。<br/>
 2、把DBus庫打包成jar包,方到你項目的libs中,記得添加引用。<br/>
 3、把DBus庫打包成aar,方到你項目的libs中,記得添加引用。<br/>
當然,用aar沒意義,因為DBus項目中沒有資源文件。<br/>


DBus使用教程:
一、訂閱者:
1、訂閱消息:<br/>
在類的初始化方法注冊事件,比喻Activity的onCreate方法中注冊:<br/>
 DBus.getBus().register(this);


2、取消訂閱<br/>
在類的結束方法反注冊,比喻Activity的onDestory方法中反注冊:<br/>
 DBus.getBus().unRegister(this);<br/>


3、在當前類的某位置添加接收消息的方法:<br/>
public void onUIEventImageView(DData data){<br/>
  //示例方法,非標准<br/>
  //如果data是你自定義的子類<br/>
  YourData yData = (YourData)data;<br/>
}<br/>
或<br/>
@DBusInject(port = 23)<br/>
public void dBusUpdateImageView(DData data){<br/>
  //示例方法,非標准<br/>
  //如果data是你自定義的子類<br/>
  YourData yData = (YourData)data;<br/>
}


二、發布者:
可以在任意線程、任意位置發送消息。只要你確保接收消息的對象沒有調用unRegister反注冊方法,就能100%接收到消息。注意DData構造函數的port參數,及注解中的port參數。<br/>
發送消息示例:<br/>
1、最簡方式:<br/>
DBus.getBus().post(new DData(1));<br/>


2、攜帶參數:<br/>
DData data = new DData(DData.PORT_RECEIVE_METHOD_NAME, DData.THREAD_UI);<br/>
data.str1 = "成功";<br/>
data.int1 = 40;<br/>
DBus.getBus().post(data);<br/>


3、攜帶自定義類的參數(注意:MyData extends DData):<br/>
MyData data = new MyData(DData.PORT_RECEIVE_ALL);<br/>
data.str1 = "成功";<br/>
data.int1 = 40;<br/>
data.myValue = "自定義屬性";<br/>
DBus.getBus().post(data);<br/>




注意事項,及哪些訂閱者能收到消息:<br/>
1、注意消息接收方法的方法名限定方式,有UI線程和子線程兩種類型方法;<br/>


2、注意消息接收方法的注解方式,有兩個參數,端口和線程。port端口值建議大於0,至少不能等於DData.PORT_RECEIVE_METHOD_NAME = -1和DData.PORT_RECEIVE_ALL = 0兩個常量值;thread值只建議使用DThreadType接口里面的3個常量值,分別表示0-UI線程,1-當前子線程,2-new子線程。<br/>


3、發送方法DBus.getBus().post(data)的data參數,注意DData的構造函數public DData(int port, int thread){...}。<br/>
port參數值:<br/>
DData.PORT_RECEIVE_METHOD_NAME,表示只有方法名限定方式的消息接收方法能收到。<br/>
DData.PORT_RECEIVE_ALL,表示所有的消息接收方法都能收到。<br/>
如果不是以上值,則只有注解的方法,且port相等的才能收到。<br/>


thread參數值:<br/>
DData.THREAD_UI,表示只有UI線程的消息接收方法能收到。<br/>
DData.THREAD_ALL,表示所有的消息接收方法都能收到。<br/>
DData.THREAD_CHILD,表示只有子線程的消息接收方法能收到。<br/>




此處兩個參數很關鍵,可以雙重限制已達到特殊的一部分方法能收到消息的目的。<br/>




4、已經反注冊的訂閱者不會收到任何消息,無管是注解方式,還是方法名限定方式。因為DBus已經不再持有反注冊的訂閱者對象了。<br/>


感謝各位碼友支持!<br/>
不要問為什么項目叫DBus,請原諒我自私的用了字母D。









注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com