eventbus 事件總路線-dhroid文檔

tags:    時間:2014-03-26 16:38:42
eventbus 事件匯流排-dhroid文檔

你聽過onClick 事件,onItemClick 事件,事件匯流排不一定聽過吧,

eventbus 事件匯流排也是一個編程思想,為什麼要設計EventBus了,因為他是領域驅動設計中比不可少的模塊,它承擔傳輸數據的作用,它可以解耦模塊之間的耦合性。

在android開發過程中,我們總會遇到各個組件模塊之間的通信,當功能點越來越多的時候,組件間的通信難免會變得混亂

 

我們還是已事例說明為什麼要用eventbus

 

 

假設你有A,B,C,D,E,F幾個頁面, A 是列表,A->B,或者A->C B->D->E-F F 是發布頁, A頁面從B,C,D,E返回時都是不需要刷新的,只有從F返回,A才需要刷新 這種情況不知道各位是怎麼解決的

 

在說個你有一個service是輪詢後台伺服器的查看用戶消息數,當有新消息時,如果用戶在msg頁面,需要刷新當前頁 你是通過廣播機制處理嗎?寫起來很煩吧

 

 

還有假設在第一個頁面的左側滑中,會顯示用戶的頭像,用戶名等信息,你是每次打開側滑時你是一直獲取數據嗎,當然有人知道可以放到perference中 但是什麼時候更新perference中的數據了,用戶更新了各種資料,發布了什麼都可以更新數據,維護這個更新也不容易吧

說了這麼多一直沒說重點下下面開始

 

使用eventbus只需要在類中注入一個eventbus單例介面(IOC的知識請先看前面的文檔)

 

@Inject EventBus bus;

 然後我們可以在需要監聽事件的地方

 

 

     //這個是在後台處理事件       bus.registerListener("事件名", "監聽器名字", new OnEventListener(){ 			@Override 			public Boolean doInBg(Event event) { 				 super.doInBg(event); 				 Log.v(log_tag, "我是在後台線程處理的請勿操作UI,我接受到的參數是"+event.getParams()[0]); 				return false; 			} 		}); 或者         //這個是前台處理事件 	bus.registerListener("事件名", "監聽器名字", new OnEventListener(){ 			@Override 			public Boolean doInUI(Event event) { 				 super.doInUI(event);      			         dialoger.showToastShort(EventBusOneActivity.this, 我是在UI線程處理的,我接受到的參數1是"+event.getParams()[0]+"我接受到的參數2是"+event.getParams()[1]);      			        return false; 			} 		});   

 這樣就可以註冊事件監聽了

發布事件

	bus.fireEvent("事件名","可以傳遞多個參數","參數2");

取消監聽

       bus.unregisterListener("事件名","監聽器名");

 

 

 

 

上面是事件監聽和發布的基本模式

 

注意,我們的監聽是有延時的,就是說registerListener時,eventbus會將之前發布的事件觸發一下

,也就是說你先fireEvent,然後在registerListener也是可以監聽到事件的

有人可能會問為什麼會這樣設計

因為我希望 A 頁面中,在onResume中我們註冊事件,在onStop中我們取消監聽

如果你要清空你註冊事件之前發布的事件可以

 

bus.clearEventTime("事件名", "監聽名");

 

 

 

 

問題2解決,只需要在service中發布事件,在你有關的頁面,監聽事件就行

問題3解決, 先註冊一個監聽器,事件發布時網路獲取用戶信息,當用戶更新頭像后,發布一下事件就行

 

下面是用註解實現

 

   

     @OnEvent(name="事件名",ui=true,onBefore=true) 	public void onEvent2(String p1,String p2){ 		dialoger.showToastShort(this, "事件2觸發參數1:"+p1+"參數2:"+p2 ); 	}

 

註解name參數,事件名,ui是否在ui線程,onBefore=true,可以監聽事件監聽前的事件

 

當然使用這個註解還需要

 

	@Override 	protected void onResume() { 		super.onResume(); 		EventInjectUtil.inject(this); 	} 	@Override 	protected void onStop() { 		super.onStop(); 		EventInjectUtil.unInject(this); 	} 你也可以寫在onCreate 和finish里

 開源中國地址:http://www.oschina.net/p/dhroid

開源項目地址:http://git.oschina.net/tengzhinei/dhroid
qq交流群:297593013(歡迎加入)

推薦閱讀文章

Bookmark the permalink ,來源:互聯網