Android方便的訊息傳遞框架EventBus使用和優化
阿新 • • 發佈:2019-01-24
一、EventBus的作用EventBus可以實現各個元件之間、以及各元件與後臺執行緒間的訊息傳遞,用來處理一些隨資料變化及時更新的介面十分方便,而且使用了EventBus後我們不用再獲得對方的引用即可向對方傳遞資料。二、EventBus的使用 場景是,我們有訊息釋出類Publisher,訊息訂閱類Subscriber1,Subscriber2。現在需要從釋出類類中傳送一條訊息,使得兩個訂閱者都能收到這條訊息並執行相應的操作。
這裡表明下:以下我所寫的“訊息”,大多數人都說成“事件”,但是個人認為說成訊息更加方便理解,因此以下大都說成訊息了,純屬個人喜好。
首先需要在專案中整合EventBus的依賴包。可以採用兩種方式來實現,gradle實現和直接下載對應的jar包新增到libs資料夾中。 完成EventBus的整合後,用EventBus實現訊息傳遞的例子:以上程式碼執行Publisher.post(new Message1 ())的輸出結果如下: Subscriber1 接收到訊息1 Subscriber2 接收到訊息1 如果新增一個 訊息類Message2,Message1和Message2分別通知兩個訊息訂閱類,做出如下改動: 新增訊息類Message2,//訊息類,可以理解為這個就是釋出的訊息,需要傳遞的資料也可以儲存在這個物件中,此物件也可以是區別事件的標識 publish Class Message1{ //就不寫get和set方法了 public String content; } //訊息釋出類 publish Class Publisher{ public static void post(Message1 message){ EventBus.getDefault().post(message); } } //訊息訂閱類 publish Class Subscriber1{ public Subscriber1( ){ //在構造方法中訂閱訊息 EventBus.getDefault().register(this); } //添加註解,用於框架識別是否是訊息處理方法,如果是的話會進一步去判斷引數型別,根據引數型別決定呼叫哪個訊息處理方法。 @Subscribe(threadMode = ThreadMode.MAIN) //在ui執行緒執行 public void onMyEvent(Message1 message){ System.out.println("Subscriber1 接收到訊息1"); } } publish Class Subscriber2{ public Subscriber2( ){ EventBus.getDefault().register(this); } @Subscribe(threadMode = ThreadMode.MAIN) //在ui執行緒執行 public void onMyEvent(Message1 message){ System.out.println("Subscriber2 接收到訊息1"); } }
publish Class Message2{
public String content;
}
修改Subscriber2的事件處理方法,然後分別在呼叫Publisher.post(new Message1())和Publisher.post(new Message2()),輸出結果如下:Subscriber1 接收到訊息1 Subscriber2 接收到訊息2接下來修改Subscriber1的程式碼如下,publish Class Subscriber2{ public Subscriber2( ){ EventBus.getDefault().register(this); } @Subscribe(threadMode = ThreadMode.MAIN) //在ui執行緒執行 public void onMyEvent(Message2 message){ System.out.println("Subscriber2 接收到訊息2"); } }
publish Class Subscriber1{
public Subscriber1( ){
//在構造方法中訂閱訊息
EventBus.getDefault().register(this);
}
//添加註解,用於框架識別是否是訊息處理方法,如果是的話會進一步去判斷引數型別,根據引數型別決定呼叫哪個訊息處理方法。
@Subscribe(threadMode = ThreadMode.MAIN) //在ui執行緒執行
public void onMyEvent1(Message1 message){
System.out.println("Subscriber1 接收到訊息1");
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMyEvent2(Message2 message){
System.out.println("Subscriber1 接收到訊息2");
}
}
然後分別在呼叫Publisher.post(new Message1())和Publisher.post(new Message2()),輸出結果如下:Subscriber1 接收到訊息1 Subscriber1 接收到訊息2 Subscriber2 接收到訊息2三、EventBus的缺點和優化優點:簡化元件之間的通訊方式,實現解耦讓業務程式碼更加簡潔。 缺點:目前發現唯一的缺點就是每個訊息都必須自定義一個訊息類和一個訊息處理方法,造成程式碼維護難度提高。 這裡提供一種一定程度上解決以上問題的方法: 定義一個GeneralMessage訊息類。程式碼如下,public Class GeneralMessage{ HashMap<String,Object> hashmap=new HashMap<String,Object>();//用來儲存要傳遞的資料 private String name; public GeneralMessage(String name){//用來標識不同的訊息型別 this.name=name; } }
修改訊息釋出類
//訊息釋出類 publish Class Publisher{ public static void post(){ GeneralMessage message1=new GeneralMessage("message1"); message1.hashMap=new HashMap<>(); message1.hashMap.put("name","訊息1"); GeneralMessage message2=new GeneralMessage("message2"); message2.hashMap=new HashMap<>(); message2.hashMap.put("name","訊息2"); EventBus.getDefault().post(message1); EventBus.getDefault().post(message2); } }訊息訂閱類程式碼如下:
public class Subscriber1 {
public Subscriber1( ){
//在構造方法中訂閱訊息
EventBus.getDefault().register(this);
}
//添加註解,用於框架識別是否是訊息處理方法,如果是的話會進一步去判斷引數型別,根據引數型別決定呼叫哪個訊息處理方法。
@Subscribe(threadMode = ThreadMode.MAIN) //在ui執行緒執行
public void onMyEvent1(GeneralMessage event){
String param=event.hashMap.get("name").toString();
if(param.equals("message1"));{
System.out.println("Subscriber1 接收到訊息1--"+param);
}else{
System.out.println("Subscriber1 接收到訊息2--"+param);
}
}
}
呼叫方法Publisher.post(),輸出結果如下: Subscriber1 接收到訊息1--訊息1 Subscriber1 接收到訊息2--訊息2這樣可以在同一個方法中接收各種訊息,同時也可以用一個訊息類來傳遞各種不同的訊息。以上內容如有錯誤,歡迎指正。