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

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

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

2019-11-14 15:28:06
字體:
供稿:網(wǎng)友

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ò)的開源庫EventBus,相信很多做過Android開發(fā)的朋友都或多或少對此有所了解。

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

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

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

2、初探EventBus:

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

  

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

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

 1 package com.lcw.rabbit.eventbusdemo.eventbusdemo; 2  3 import android.content.Intent; 4 import android.os.Bundle; 5 import android.support.v7.app.AppCompatActivity; 6 import android.view.View; 7 import android.widget.Button; 8 import android.widget.TextView; 9 10 import de.greenrobot.event.EventBus;11 12 public class MainActivity extends AppCompatActivity {13 14     PRivate Button mBt_1;15     private TextView mTv_1;16 17     @Override18     protected void onCreate(Bundle savedInstanceState) {19         super.onCreate(savedInstanceState);20         setContentView(R.layout.activity_main);21         //注冊綁定EventBus22         EventBus.getDefault().register(this);23 24         initView();25         initAction();26 27     }28 29     private void initAction() {30         mBt_1.setOnClickListener(new View.OnClickListener() {31             @Override32             public void onClick(View v) {33                 startActivity(new Intent(MainActivity.this, SecondActivity.class));34             }35         });36     }37 38     private void initView() {39         mBt_1 = (Button) findViewById(R.id.bt_1);40         mTv_1 = (TextView) findViewById(R.id.tv_info1);41     }42 43 44     //接收所訂閱的消息45     public void onEventMainThread(MyEvent myEvent) {46         if (myEvent.getInfo()!=null) {47             mTv_1.setText(myEvent.getInfo());48         }49 50     }51 52 53     @Override54     protected void onDestroy() {55         super.onDestroy();56         //解綁EventBus57         EventBus.getDefault().unregister(this);58     }59 }
MainActivity.java
 1 package com.lcw.rabbit.eventbusdemo.eventbusdemo; 2  3 import android.os.Bundle; 4 import android.support.v7.app.AppCompatActivity; 5 import android.view.View; 6 import android.widget.Button; 7 import android.widget.Toast; 8  9 import de.greenrobot.event.EventBus;10 11 public class SecondActivity extends AppCompatActivity {12 13     private Button mBt_2;14 15     @Override16     protected void onCreate(Bundle savedInstanceState) {17         super.onCreate(savedInstanceState);18         setContentView(R.layout.activity_second);19         initView();20         initAction();21 22     }23 24     private void initAction() {25         mBt_2.setOnClickListener(new View.OnClickListener() {26             @Override27             public void onClick(View v) {28                 Toast.makeText(SecondActivity.this,"消息已發(fā)送",Toast.LENGTH_SHORT).show();29                 EventBus.getDefault().post(new MyEvent("我是被發(fā)送過來的消息"));30 31             }32         });33     }34 35     private void initView() {36         mBt_2 = (Button) findViewById(R.id.bt_2);37     }38 39 40 }
SecondActivity.java
 1 package com.lcw.rabbit.eventbusdemo.eventbusdemo; 2  3 /** 4  * Created by Lichenwei 5  * Date: 2015-10-11 6  * Time: 18:23 7  */ 8 public class MyEvent { 9 10     private String info;11 12     public MyEvent(String info) {13         this.info = info;14     }15 16     public String getInfo() {17         return info;18     }19 20     public void setInfo(String info) {21         this.info = info;22     }23 }
MyEvent

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

3、解析代碼:

1、注冊EventBus: 

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

1 //注冊綁定EventBus2 EventBus.getDefault().register(this);3 //解綁EventBus4 EventBus.getDefault().unregister(this);

 

2、EventBus事件:

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

 

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

  有了事件之后,我們就可以對事件進(jìn)行發(fā)布,然后可以被訂閱這個(gè)事件的所有訂閱者所接收。發(fā)送事件很簡單,有兩種方法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)行注冊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里的所有角色后,我們來理一理訂閱/被訂閱流程:

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

 

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

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

  例如:

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

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

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

 

5、理解EventBus

  從源碼中我們可以知道,當(dāng)我們在類中注冊綁定EventBus的時(shí)候,它會(huì)去掃描當(dāng)前類并記錄下所有已onEvent開頭的方法,存放在一個(gè)Map<Key,Value>中,在事件通過post發(fā)布之后,EventBus會(huì)根據(jù)post中實(shí)參的類型,去Map中查找對應(yīng)的方法,并找到了對應(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ā)布的事件,則加入后臺任務(wù)隊(duì)列,使用線程池一個(gè)接一個(gè)調(diào)用。

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

 

作者:李晨瑋
出處:http://m.survivalescaperooms.com/lichenwei/
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。
正在看本人博客的這位童鞋,我看你氣度不凡,談吐間隱隱有王者之氣,日后必有一番作為!旁邊有“推薦”二字,你就順手把它點(diǎn)了吧,相得準(zhǔn),我分文不收;相不準(zhǔn),你也好回來找我!

 


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 鹤山市| 勃利县| 黄山市| 涪陵区| 子长县| 威宁| 临朐县| 色达县| 高碑店市| 林口县| 修文县| 鄂托克旗| 清远市| 吴旗县| 龙陵县| 莱阳市| 顺昌县| 永顺县| 许昌市| 佛冈县| 锡林浩特市| 颍上县| 鄂尔多斯市| 大城县| 洛川县| 广灵县| 梧州市| 祁门县| 河南省| 尼木县| 高阳县| 蒙城县| 沛县| 临沭县| 上思县| 昌邑市| 集安市| 库尔勒市| 白朗县| 灌云县| 江山市|