自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

安卓開發(fā)筆記——探索EventBus

開發(fā) 后端
組件通訊在Android開發(fā)中是不可避免的,隨著業(yè)務(wù)需求的復(fù)雜化,代碼中需要我們?nèi)ヌ幚淼臉I(yè)務(wù)邏輯難度也不斷增大。

1、關(guān)于EventBus:

組件通訊在Android開發(fā)中是不可避免的,隨著業(yè)務(wù)需求的復(fù)雜化,代碼中需要我們?nèi)ヌ幚淼臉I(yè)務(wù)邏輯難度也不斷增大。例如多個(gè)Fragment之間的數(shù)據(jù)傳遞,Service與Activity、Fragment之間的通訊,BroadCast與Activity、Fragment之間的通訊,各種startActivityForResult的使用,繁雜的操作令我們所厭倦,在GitHub上找了下解決方案,發(fā)現(xiàn)了一個(gè)不錯(cuò)的開源庫(kù)EventBus,相信很多做過Android開發(fā)的朋友都或多或少對(duì)此有所了解。

  EventBus是一款針對(duì)Android優(yōu)化的發(fā)布/訂閱事件總線。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,線程之間傳遞消息.優(yōu)點(diǎn)是開銷小,代碼更優(yōu)雅。以及將發(fā)送者和接收者解耦。

  這是EventBus在GitHub上的開源庫(kù)地址:https://github.com/greenrobot/EventBus

  EventBus的大體關(guān)系是這樣的:訂閱者(Subscriber)通過訂閱事件(Event)到總線,事件發(fā)布者(Publisher)發(fā)布事件(Event)到總線被訂閱者(Subscriber)接收,其實(shí)說白了就是軟件設(shè)計(jì)模式里的觀察者模式。EventBus在使用的時(shí)候就是在合適的地方發(fā)布一個(gè)事件,使得注冊(cè)了該事件接收的對(duì)象就可以收到通知,進(jìn)行相應(yīng)的操作。

2、初探EventBus:

  文縐縐的文字描述令人厭煩,直接上代碼說話吧,先來看下要實(shí)現(xiàn)的效果:

  

  看似很簡(jiǎn)單的效果,點(diǎn)擊按鈕跳轉(zhuǎn)界面,利用Intent發(fā)送一個(gè)消息,然后TextView接收顯示。這是傳統(tǒng)上的做法,如果真是這樣做,那么寫這篇文章的就完全沒意義了。其實(shí)這里就是利用到了EventBus,并沒有用到Intent來傳遞消息。

  先來看下具體的代碼(記得添加EventBus的引用),然后我再分部來解析:

[[151946]] MainActivity.java
[[151946]] SecondActivity.java
[[151946]] MyEvent

  上面的代碼很簡(jiǎn)單,這里只是拋磚引玉并不做太多復(fù)雜的操作,大家可以根據(jù)自己的項(xiàng)目需求來添加對(duì)應(yīng)的代碼。

3、解析代碼:

1、注冊(cè)EventBus: 

  在添加EventBus的引用后,我們就可以對(duì)任意類進(jìn)行注冊(cè)綁定和解綁EventBus事件,注冊(cè)方法和反注冊(cè)方法很簡(jiǎn)單,在上面的代碼中就可以看出來了,分別是register和unregister,這里的EventBus.getDefault是獲取到EventBus實(shí)例的意思(單例)。

1 //注冊(cè)綁定EventBus
2 EventBus.getDefault().register(this);
3 //解綁EventBus
4 EventBus.getDefault().unregister(this);

 

2、EventBus事件:

  EventBus很靈活,它對(duì)事件不進(jìn)行任何的限制,也不需要繼承或者實(shí)現(xiàn)任何類或者接口,可以是任意類型的實(shí)體類,好比上面代碼提到的MyEvent。

 

3、EventBus事件發(fā)布者:

  有了事件之后,我們就可以對(duì)事件進(jìn)行發(fā)布,然后可以被訂閱這個(gè)事件的所有訂閱者所接收。發(fā)送事件很簡(jiǎn)單,有兩種方法post與postSticky:

1 //立即發(fā)送事件 
2 EventBus.getDefault().post(Object event);
3 //延遲發(fā)送事件
4 EventBus.getDefault().postSticky(Objet event);

 

4、EventBus事件訂閱者:

  EventBus的事件訂閱者可以是任何已經(jīng)進(jìn)行注冊(cè)EventBus的類,訂閱者的數(shù)量是沒有上限的(很重要,下文會(huì)提到),這里的訂閱有4種方法,這里都是由onEvent開頭的,有著一定的區(qū)別:

  1、onEvent:

  如果使用onEvent作為訂閱函數(shù),那么該事件在哪個(gè)線程發(fā)布出來的,onEvent就會(huì)在這個(gè)線程中運(yùn)行,也就是說發(fā)布事件和接收事件線程在同一個(gè)線程。使用這個(gè)方法時(shí),在onEvent方法中不能執(zhí)行耗時(shí)操作,如果執(zhí)行耗時(shí)操作容易導(dǎo)致事件分發(fā)延遲。
2、onEventMainThread:

  如果使用onEventMainThread作為訂閱函數(shù),那么不論事件是在哪個(gè)線程中發(fā)布出來的,onEventMainThread都會(huì)在UI線程中執(zhí)行,接收事件就會(huì)在UI線程中運(yùn)行,這個(gè)在Android中是非常有用的,因?yàn)樵贏ndroid中只能在UI線程中跟新UI,所以在onEvnetMainThread方法中是不能執(zhí)行耗時(shí)操作的。
3、onEventBackground:

  如果使用onEventBackgrond作為訂閱函數(shù),那么如果事件是在UI線程中發(fā)布出來的,那么onEventBackground就會(huì)在子線程中運(yùn)行,如果事件本來就是子線程中發(fā)布出來的,那么onEventBackground函數(shù)直接在該子線程中執(zhí)行。
4、onEventAsync:

  使用這個(gè)函數(shù)作為訂閱函數(shù),那么無論事件在哪個(gè)線程發(fā)布,都會(huì)創(chuàng)建新的子線程在執(zhí)行onEventAsync。

1  public void onEvent(Object event) {}
2  public void onEventMainThread(Object event) {}
3  public void onEventBackgroundThread(Object event) {}
4  public void onEventAsync(Object event) {}

  介紹完EventBus里的所有角色后,我們來理一理訂閱/被訂閱流程:

  首先,要想成為事件訂閱者需要先對(duì)EventBus進(jìn)行注冊(cè)綁定,然后在本類需要去寫一個(gè)以onEvent開頭的方法來接收處理消息事件,再來我們需要一個(gè)自定義的事件可以讓事件的發(fā)布者發(fā)布,讓事件的訂閱者接收。事件的發(fā)布可以通過post方法或者是postSticky方法發(fā)布。

 

4、EventBus所帶來的一些方便之處:

  EventBus是一款針對(duì)Android優(yōu)化的發(fā)布/訂閱事件總線。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,線程之間傳遞消息.優(yōu)點(diǎn)是開銷小,代碼更優(yōu)雅。以及將發(fā)送者和接收者解耦。這是我們?cè)谖恼麻_頭所介紹過的,這里就不多說了,說幾個(gè)在實(shí)際開發(fā)中所運(yùn)用到的地方。

  例如:

  1、當(dāng)某個(gè)頁(yè)面的某些值發(fā)生變化的時(shí)候,需要去同時(shí)去更改多個(gè)頁(yè)面相對(duì)應(yīng)的值,這時(shí)候只要這些類注冊(cè)訂閱了該事件,那么我們就可以很輕松通過post發(fā)送消息來進(jìn)行通訊。

  2、某些時(shí)候,我們并不希望發(fā)布出來的Event立即被消費(fèi)掉,而是等到時(shí)機(jī)成熟。比如說,在一個(gè)詳情頁(yè)點(diǎn)贊之后,產(chǎn)生一個(gè)事件,這個(gè)事件并不立即被消費(fèi),而是等用戶退出詳情頁(yè)回到商品列表之后,接收到該事件,然后刷新Adapter等。其實(shí)這就是之前我們用startActivityForResult和onActivityResult做的事情。這里我們就可以利用postSticky來實(shí)現(xiàn)這樣的機(jī)制。

  總之,EventBus極大的減輕了我們各種組件之間的通訊復(fù)雜度,也大大減少了使用ActivityForResult的麻煩。真實(shí)值得極力推薦。

 

5、理解EventBus

  從源碼中我們可以知道,當(dāng)我們?cè)陬愔凶?cè)綁定EventBus的時(shí)候,它會(huì)去掃描當(dāng)前類并記錄下所有已onEvent開頭的方法,存放在一個(gè)Map<Key,Value>中,在事件通過post發(fā)布之后,EventBus會(huì)根據(jù)post中實(shí)參的類型,去Map中查找對(duì)應(yīng)的方法,并找到了對(duì)應(yīng)的Thread,最終利用Java的反射機(jī)制去執(zhí)行我們的方法。

  onEventMainThread表示這個(gè)方法會(huì)在UI主線程執(zhí)行。

  onEventPostThread表示這個(gè)方法會(huì)在當(dāng)前發(fā)布事件的線程中執(zhí)行。

  BackgroundThread表示如果在非UI主線程發(fā)布的事件,則直接執(zhí)行,和發(fā)布在同一個(gè)線程中。如果在UI線程發(fā)布的事件,則加入后臺(tái)任務(wù)隊(duì)列,使用線程池一個(gè)接一個(gè)調(diào)用。

  Async 加入后臺(tái)任務(wù)隊(duì)列,使用線程池調(diào)用,注意沒有BackgroundThread中的一個(gè)接一個(gè)。

責(zé)任編輯:李英杰 來源: 博客園
相關(guān)推薦

2013-09-12 12:55:53

iOS開發(fā)

2012-05-17 11:45:12

iPhone

2021-11-11 17:36:07

鴻蒙HarmonyOS應(yīng)用

2022-08-15 22:09:37

設(shè)備開發(fā)開發(fā)筆記

2012-03-28 09:54:32

安卓開發(fā)初級(jí)教程

2012-03-26 09:27:40

谷歌安卓開發(fā)谷歌安卓

2014-07-18 13:37:23

Android開發(fā)App Widget

2021-02-03 09:59:02

鴻蒙HarmonyOS應(yīng)用開發(fā)

2009-06-17 14:33:08

java項(xiàng)目開發(fā)

2014-02-26 13:08:48

AndroidService教程

2012-03-26 09:44:32

安卓開發(fā)配置Eclipse

2014-12-16 11:16:05

2013-06-24 17:14:00

安卓

2022-08-09 07:57:25

Linux操作系統(tǒng)Windows

2012-03-28 09:40:55

安卓開發(fā)入門教程視頻

2014-08-06 09:13:40

java安卓ios

2013-06-24 17:23:23

安卓客戶端

2011-09-26 17:02:05

安卓蜂窩冰激凌三明治

2014-04-18 13:20:34

Android安卓開發(fā)工具

2012-03-26 09:00:38

VisionMobil安卓開發(fā)平臺(tái)安卓
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)