最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解EventBus 3.x 的快速使用

 更新時(shí)間:2018年02月27日 09:31:57   作者:ayuhani  
這篇文章主要介紹了詳解EventBus 3.x 的快速使用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

EventBus 可以很方便地進(jìn)行各組件間的通信,解耦性更強(qiáng),比廣播更好用。

EventBus 3 簡(jiǎn)介

EventBus是一種為了優(yōu)化Android組件之間事件傳遞的解耦工具,通過發(fā)布/訂閱事件總線來實(shí)現(xiàn)事件在不同組件之間的事件傳遞。

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

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

EventBus 3 和 EventBus 2.x 的區(qū)別

回調(diào)方法改動(dòng)

由于API的改動(dòng),會(huì)導(dǎo)致EventBus3和之前使用老版本的EventBus不兼容,因?yàn)橹鞍姹荆‥ventBus 2.x),在注冊(cè)完事件之后,會(huì)要求寫相應(yīng) onEvent()方法,包括onEvent()、onEventAsync()、onEventBackground()、onEventMainThread() 分別對(duì)應(yīng) @Subscrible 、@Subscrible(threadMode = ThreadMode.ASYNC)、@Subscribe(threadMode = ThreadMode.BACKGROUND)、@Subscribe(threadMode = ThreadMode.MAIN) 。EventBus 3中在未聲明threadMob時(shí),默認(rèn)的線程模式為ThreadMode.POSTING。

異常容錯(cuò)處理

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

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

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

以上代碼使用Builder設(shè)計(jì)模式,來構(gòu)建返回一個(gè)eventBus實(shí)例。在調(diào)試階段,可以在程序出現(xiàn)異常時(shí)直接Crash發(fā)現(xiàn)錯(cuò)誤。

快速使用

1. 編譯

compile 'org.greenrobot:eventbus:3.1.1'

2. 自定義事件類

public class MessageEvent {
  // 成員變量根據(jù)自己的需求創(chuàng)建
  private int type;

  // 通過構(gòu)造方法傳遞數(shù)據(jù)
  public MessageEvent(int type) {
    this.type = type;
  }

  public int getType() {
    return type;
  }

  public void setType(int type) {
    this.type = type;
  }
}

3. 注冊(cè)事件與解除注冊(cè)

一般來說,在 OnCreate() 方法中進(jìn)行注冊(cè):

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

與之對(duì)應(yīng)的,在 OnDestroy() 中解除注冊(cè):

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

4. 發(fā)送事件

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(默認(rèn)): 事件處理方法的線程跟發(fā)布事件的線程是同一個(gè)線程;
  2. MAIN:在 Android 中,事件處理方法在主線程 (UI線程) 中調(diào)用,不能進(jìn)行耗時(shí)操作;
  3. MAIN_ORDERED:在 Android 中,事件處理方法在主線程 (UI線程) 中調(diào)用。 與 MAIN 不同的是,該事件將始終排隊(duì)等待發(fā)布,這確保了事件發(fā)布不會(huì)被阻塞;
  4. BACKGROUND:在 Android 中,事件處理方法在后臺(tái)線程中調(diào)用,因此不能進(jìn)行 UI 操作。如果發(fā)布事件的線程是主線程 (UI線程),那么事件處理函數(shù)將會(huì)開啟一個(gè)后臺(tái)線程,如果果發(fā)布事件的線程是在后臺(tái)線程,那么事件處理函數(shù)就使用該線程;
  5. ASYNC:無論事件發(fā)布的線程是哪一個(gè),事件處理方法始終會(huì)新建一個(gè)子線程運(yùn)行,不能進(jìn)行 UI 操作。

以上便是 EventBus 的最基本的使用,是不是很方便呢。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android實(shí)現(xiàn)關(guān)機(jī)重啟的方法分享

    Android實(shí)現(xiàn)關(guān)機(jī)重啟的方法分享

    這篇文章主要介紹了Android實(shí)現(xiàn)關(guān)機(jī)重啟的方法,需要的朋友可以參考下
    2014-02-02
  • Android如何解析異構(gòu)列表

    Android如何解析異構(gòu)列表

    這篇文章主要介紹了Android如何解析異構(gòu)列表,幫助大家更好的理解和學(xué)習(xí)使用Android,感興趣的朋友可以了解下
    2021-03-03
  • Android中SoundPool的使用步驟實(shí)例

    Android中SoundPool的使用步驟實(shí)例

    今天小編就為大家分享一篇關(guān)于Android中SoundPool的使用步驟實(shí)例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • android 使用kotlin 實(shí)現(xiàn)點(diǎn)擊更換全局語言(中日英切換)

    android 使用kotlin 實(shí)現(xiàn)點(diǎn)擊更換全局語言(中日英切換)

    這篇文章主要介紹了android kotlin 點(diǎn)擊更換全局語言的實(shí)現(xiàn)方法,這里主要介紹中日英切換,需要的朋友可以參考下
    2019-11-11
  • 詳解LeakCanary分析內(nèi)存泄露如何實(shí)現(xiàn)

    詳解LeakCanary分析內(nèi)存泄露如何實(shí)現(xiàn)

    這篇文章主要為大家介紹了詳解LeakCanary分析內(nèi)存泄露如何實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Android逆向入門之常見Davlik字節(jié)碼解析

    Android逆向入門之常見Davlik字節(jié)碼解析

    Dalvik是Google公司自己設(shè)計(jì)用于Android平臺(tái)的虛擬機(jī)。Dalvik虛擬機(jī)是Google等廠商合作開發(fā)的Android移動(dòng)設(shè)備平臺(tái)的核心組成部分之一,本篇文章我們來詳細(xì)解釋常見Davlik字節(jié)碼
    2021-11-11
  • Flutter事件監(jiān)聽與EventBus事件的應(yīng)用詳解

    Flutter事件監(jiān)聽與EventBus事件的應(yīng)用詳解

    EventBus的核心是基于Streams。它允許偵聽器訂閱事件并允許發(fā)布者觸發(fā)事件,使得不同組件的數(shù)據(jù)不需要一層層傳遞,可以直接通過EventBus實(shí)現(xiàn)跨組件通訊
    2023-04-04
  • Android程序結(jié)構(gòu)簡(jiǎn)單講解

    Android程序結(jié)構(gòu)簡(jiǎn)單講解

    在本篇文章里小編給大家分享一篇關(guān)于Android程序結(jié)構(gòu)的簡(jiǎn)單說明內(nèi)容,有需要的朋友們跟著學(xué)習(xí)下。
    2019-02-02
  • 分析Android中線程和線程池

    分析Android中線程和線程池

    我們知道線程是CPU調(diào)度的最小單位。在Android中主線程是不能夠做耗時(shí)操作的,子線程是不能夠更新UI的。在Android中,除了Thread外,扮演線程的角色有很多,如AsyncTask,IntentService和HandlerThread等等。本文將介紹Android中線程和線程池。
    2021-06-06
  • 基于Android實(shí)現(xiàn)的文件同步設(shè)計(jì)方案

    基于Android實(shí)現(xiàn)的文件同步設(shè)計(jì)方案

    隨著用戶對(duì)自身數(shù)據(jù)保護(hù)意識(shí)的加強(qiáng),讓用戶自己維護(hù)自己的數(shù)據(jù)也成了獨(dú)立開發(fā)產(chǎn)品時(shí)的一個(gè)賣點(diǎn),若只針對(duì)少量的文件進(jìn)行同步,則實(shí)現(xiàn)起來比較簡(jiǎn)單,當(dāng)針對(duì)一個(gè)多層級(jí)目錄同步時(shí),情況就復(fù)雜多了,本文我分享下我的設(shè)計(jì)思路
    2023-10-10

最新評(píng)論

兴安盟| 永修县| 江孜县| 海丰县| 延川县| 松桃| 晋宁县| 普定县| 东平县| 讷河市| 抚宁县| 兰考县| 海盐县| 清原| 岳池县| 武川县| 宜都市| 宁城县| 安阳县| 荥阳市| 广河县| 长岛县| 正定县| 万年县| 襄垣县| 高州市| 绥中县| 高要市| 资兴市| 呼图壁县| 越西县| 古浪县| 壶关县| 三河市| 丹棱县| 镇安县| 逊克县| 信阳市| 水富县| 大理市| 龙州县|