国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

詳解EventBus 3.x 的快速使用

2019-10-22 18:14:35
字體:
來源:轉載
供稿:網友

EventBus 可以很方便地進行各組件間的通信,解耦性更強,比廣播更好用。

EventBus 3 簡介

EventBus是一種為了優化Android組件之間事件傳遞的解耦工具,通過發布/訂閱事件總線來實現事件在不同組件之間的事件傳遞。

在EventBus 3之前,greenrobot團隊因為考慮性能原因所以比較抵觸使用注解框架。目前的EventBus3開始使用注解來申明訂閱事件的處理方法。雖然目前Android 6 和ART都有了,但是對于Java反射造成的性能影響還是沒能很好的解決。

在EventBus3中,greenrobot團隊通過利用在編譯時檢索所有注解代碼,然后生成一個包含所有在運行時要花很大代價才能獲取的數據的類,通過這種新的注解處理方式來提升性能,讓EventBus3比其他的eventbus會更加快。在后文中會貼出和otto的性能比較。

EventBus 3 和 EventBus 2.x 的區別

回調方法改動

由于API的改動,會導致EventBus3和之前使用老版本的EventBus不兼容,因為之前版本(EventBus 2.x),在注冊完事件之后,會要求寫相應 onEvent()方法,包括onEvent()、onEventAsync()、onEventBackground()、onEventMainThread() 分別對應 @Subscrible 、@Subscrible(threadMode = ThreadMode.ASYNC)、@Subscribe(threadMode = ThreadMode.BACKGROUND)、@Subscribe(threadMode = ThreadMode.MAIN) 。EventBus 3中在未聲明threadMob時,默認的線程模式為ThreadMode.POSTING。

異常容錯處理

在EventBus3中,如果在@Subscrible標注的方法中,如果程序出錯,不會立即使程序crash,而是由EventBus攔截異常,并打印錯誤日志。

用戶可以通過EventBusBuilder來配置獲取EventBus實例后的對象,來決定在處理event時是否需要拋出異常信息:

 eventBus = EventBus.builder().sendNoSubscriberEvent(false)           .sendSubscriberExceptionEvent(false)                   .throwSubscriberException(BuildConfig.DEBUG) //只有在debug模式下,會拋出錯誤異常        .build();

以上代碼使用Builder設計模式,來構建返回一個eventBus實例。在調試階段,可以在程序出現異常時直接Crash發現錯誤。

快速使用

1. 編譯

compile 'org.greenrobot:eventbus:3.1.1'

2. 自定義事件類

public class MessageEvent {  // 成員變量根據自己的需求創建  private int type;  // 通過構造方法傳遞數據  public MessageEvent(int type) {    this.type = type;  }  public int getType() {    return type;  }  public void setType(int type) {    this.type = type;  }}

3. 注冊事件與解除注冊

一般來說,在 OnCreate() 方法中進行注冊:

@Overrideprotected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_layout);  EventBus.getDefault().register(this);}

與之對應的,在 OnDestroy() 中解除注冊:

@Overrideprotected void onDestroy() {  super.onDestroy();  EventBus.getDefault().unregister(this);}

4. 發送事件

EventBus.getDefault().post(new MessageEvent(type));

5. 接收與處理事件

/*** @Subscribe 注解必須要寫,線程需要指定* 方法名可隨意*/@Subscribe(threadMode = ThreadMode.MAIN)public void onMessageEvent(MessageEvent event) {  switch (event.getType()){    // do your thing  }}

上面提到了線程模型,它一共有 5 種:

  1. POSTING(默認): 事件處理方法的線程跟發布事件的線程是同一個線程;
  2. MAIN:在 Android 中,事件處理方法在主線程 (UI線程) 中調用,不能進行耗時操作;
  3. MAIN_ORDERED:在 Android 中,事件處理方法在主線程 (UI線程) 中調用。 與 MAIN 不同的是,該事件將始終排隊等待發布,這確保了事件發布不會被阻塞;
  4. BACKGROUND:在 Android 中,事件處理方法在后臺線程中調用,因此不能進行 UI 操作。如果發布事件的線程是主線程 (UI線程),那么事件處理函數將會開啟一個后臺線程,如果果發布事件的線程是在后臺線程,那么事件處理函數就使用該線程;
  5. ASYNC:無論事件發布的線程是哪一個,事件處理方法始終會新建一個子線程運行,不能進行 UI 操作。

以上便是 EventBus 的最基本的使用,是不是很方便呢。希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 英德市| 亳州市| 高雄县| 庆云县| 印江| 汉沽区| 印江| 井陉县| 汾西县| 孙吴县| 临潭县| 新沂市| 罗江县| 梁平县| 鲁甸县| 年辖:市辖区| 永平县| 晴隆县| 诸城市| 罗山县| 图片| 乐昌市| 富阳市| 红桥区| 庐江县| 凤翔县| 清水河县| 威信县| 拉萨市| 原平市| 禹州市| 绥江县| 长乐市| 故城县| 景谷| 耒阳市| 娱乐| 鹰潭市| 景宁| 松江区| 康乐县|