Android-EventBus-3.0.0使用

簡單介紹:

在應用中當想通知其他組件某些事情發(fā)生時就會使用到開源框架EventBus薯鳍。它主要功能是可以替代Intent、Handler崩溪、BroadCast在Fragment斩松、Activity、Service乳幸、線程之間傳遞消息钧椰。優(yōu)點是開銷小,代碼簡潔瓶埋,解耦代碼诊沪。

貼一張官方的圖:


1.png

我認為圖就描述了一件事,發(fā)布者publisher通過post方法發(fā)事件晕粪,訂閱者subscriber通過onEvent方法拿到

關鍵方法:

  • EventBus.getDefault().register(this);//訂閱事件
  • EventBus.getDefault().post(object);//發(fā)布事件
  • EventBus.getDefault().unregister(this);//取消訂閱

在事件接收方就會有四種形式(就是四種線程模式):

  • ThreadMode.POSTING:如果訂閱者在使用事件處理函數(shù)時候指定了這種線程模式巫湘,那么該事件是在哪個線程發(fā)布出來的橄仆,那么處理函數(shù)就會在這個線程中執(zhí)行,也就是說發(fā)布事件和接收事件是在同一個線程怠褐。在這種線程模式下盡量避免做耗時操作您宪,因為會阻塞事件的傳遞奠涌,很有可能引起ANR
  • ThreadMode.ASYNC:這種線程模式就是說磷杏,無論事件在哪個線程發(fā)布极祸,該事件的處理函數(shù)都會在新建的子線程中執(zhí)行,此事件處理函數(shù)中是不能進行UI操作的
  • ThreadMode.BACKGROUND:這種線程模式意思是遥金,如果事件是在UI線程中發(fā)布出來的稿械,那么該事件處理函數(shù)就會在子線程中執(zhí)行;如果事件是在子線程中發(fā)布的页眯,那就還在這個線程中處理厢呵。在這種模式下是不能更新UI操作的
  • ThreadMode.MAIN:如果線程模式是MAIN,那么無論事件是在什么線程發(fā)送出來的忿族,該事件處理函數(shù)都會在UI線程中執(zhí)行蝌矛,可以用來更新UI错英,但是注意不要做耗時操作椭岩。

舉例上代碼:

簡單一點的如:有兩個界面,ActivityA和ActivityB判哥,從ActivityA界面跳轉(zhuǎn)到ActivityB界面后塌计,ActivityB要給ActivityA發(fā)送一個消息,ActivityA收到消息后在界面上顯示出來

實現(xiàn)方式:A中注冊章钾,接收訂閱的事件,取消注冊惨撇;B中post事件府寒;先看下效果


2.png

代碼:A activity

public class MainActivity extends Activity {  
  
    Button   btn;  
    private TextView mText;  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
//注冊EventBus  
        EventBus.getDefault().register(this);  
        mText = (TextView) findViewById(R.id.text);  
        btn = (Button) findViewById(R.id.btn_try);  
  
        btn.setOnClickListener(new View.OnClickListener() {  
  
            @Override  
            public void onClick(View v) {  
                Intent intent = new Intent(getApplicationContext(), SecondActivity.class);  
                startActivity(intent);  
            }  
        });  
    }  
//接收訂閱的事件  
    @Subscribe(threadMode = ThreadMode.POSTING)  
    public void getdate(String event) {  
        mText.setText(event);  
    }  
//取消注冊  
    @Override  
    protected void onDestroy() {  
        super.onDestroy();  
        EventBus.getDefault().unregister(this);  
    }  
}

B activity

public class SecondActivity extends Activity {  
    private Button btn_FirstEvent;  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_second);  
        btn_FirstEvent = (Button) findViewById(R.id.btn_first_event);  
        btn_FirstEvent.setOnClickListener(new View.OnClickListener() {  
  
            @Override  
            public void onClick(View v) {  
//  發(fā)送事件  
                EventBus.getDefault().post("第二個界面纺棺,發(fā)送回來的POSITING");  
                Toast.makeText(getApplicationContext(), "已經(jīng)發(fā)送回去", Toast.LENGTH_SHORT).show();  
            }  
        });  
    }  
}

另一種屬性用法:EventBus還能收到未注冊時發(fā)送的最后一個事件邪狞;沒有注冊就發(fā)送事件,如發(fā)送三次后注冊巨朦,那么現(xiàn)在就能獲取到最后一次發(fā)送的事件剑令。起作用的就一句代碼,sticky = true 棚蓄;注意碍脏,發(fā)送事件時候不是post了而是postSticky;如果不加這句代碼是沒有這種效果的役拴。還是先看看圖吧


3.png

貼代碼:
主Activity

public class MainActivity extends Activity {  
  
    int index = 1;  
    int count = 1;  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_sticky_mode);  
        findViewById(R.id.post).setOnClickListener(new View.OnClickListener() {  
            @Override  
            public void onClick(View v) {  
                Toast.makeText(getApplicationContext(), "發(fā)送弟"+count++ +"次", Toast.LENGTH_SHORT).show();  
                EventBus.getDefault().postSticky(new MessageEvent("發(fā)送事件弟:" + index++ +"次"));  
            }  
        });  
        findViewById(R.id.regist).setOnClickListener(new View.OnClickListener() {  
            @Override  
            public void onClick(View v) {  
                EventBus.getDefault().register(MainActivity.this);  
            }  
        });  
  
        findViewById(R.id.unregist).setOnClickListener(new View.OnClickListener() {  
            @Override  
            public void onClick(View v) {  
                EventBus.getDefault().unregister(MainActivity.this);  
            }  
        });  
  
    }  
  
    @Subscribe(threadMode = ThreadMode.POSTING, sticky = true)  
    public void postThread(MessageEvent messageEvent) {  
        Log.e("PostThread", messageEvent.getMessage()+Thread.currentThread().getName());  
    }  
  
    @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)  
    public void mainThread(MessageEvent messageEvent) {  
        Log.e("MainThread", messageEvent.getMessage()+Thread.currentThread().getName());  
    }  
  
    @Subscribe(threadMode = ThreadMode.BACKGROUND, sticky = true)  
    public void backgroundThread(MessageEvent messageEvent) {  
        Log.e("BackgroundThread", messageEvent.getMessage()+Thread.currentThread().getName());  
    }  
  
    @Subscribe(threadMode = ThreadMode.ASYNC, sticky = true)  
    public void async(MessageEvent messageEvent) {  
        Log.e("Async", messageEvent.getMessage()+Thread.currentThread().getName());  
    }  
  
}

xml文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
              android:layout_width="match_parent"  
              android:layout_height="match_parent"  
              android:orientation="vertical">  
        <Button  
            android:id="@+id/post"  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:text="發(fā)送事件"/>  
  
        <Button  
            android:id="@+id/regist"  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:text="注冊"/>  
  
        <Button  
            android:id="@+id/unregist"  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:text="取消注冊"/>  
  
    </LinearLayout>

MessageEvent類

public class MessageEvent {  
  
    private String message;  
  
    public MessageEvent(String message) {  
        this.message = message;  
    }  
  
    public String getMessage() {  
        return message;  
    }  
  
    public void setMessage(String message) {  
        this.message = message;  
    }  
}

從圖中和代碼中也可以看出褥紫,四種線程模式的規(guī)律。從什么線程發(fā)送事件部念,到什么線程中獲得事件。

第二個示例中事件都是從主線程中發(fā)送出來的印机,接收的線程模式是Main和post的就也在主線程中接收射赛,另外兩種模式下就是在子線程中接收了。

歡迎進群討論楣责,QQ群:104286694

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末秆麸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子屯烦,更是在濱河造成了極大的恐慌房铭,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翁狐,死亡現(xiàn)場離奇詭異凌蔬,居然都是意外死亡砂心,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門钦睡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來躁倒,“玉大人洒琢,你說我怎么就攤上這事∠笥” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵啦撮,是天一觀的道長汪厨。 經(jīng)常有香客問我劫乱,道長,這世上最難降的妖魔是什么衷戈? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任殖妇,我火速辦了婚禮,結(jié)果婚禮上疲吸,老公的妹妹穿的比我還像新娘蔚润。我一直安慰自己,他們只是感情好嫡纠,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布除盏。 她就那樣靜靜地躺著,像睡著了一般窃祝。 火紅的嫁衣襯著肌膚如雪踱侣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天探膊,我揣著相機與錄音逞壁,去河邊找鬼。 笑死腌闯,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的糖声。 我是一名探鬼主播工腋,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼擅腰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了歼争?” 一聲冷哼從身側(cè)響起渗勘,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎乔遮,沒想到半個月后取刃,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡坯辩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年漆魔,在試婚紗的時候發(fā)現(xiàn)自己被綠了却音。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖八拱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情清蚀,我是刑警寧澤爹谭,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布诺凡,位于F島的核電站,受9級特大地震影響腹泌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜芥吟,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一钟鸵、第九天 我趴在偏房一處隱蔽的房頂上張望涤躲。 院中可真熱鬧,春花似錦种樱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽易稠。三九已至夷家,卻和暖如春徙赢,著一層夾襖步出監(jiān)牢的瞬間枢里,已是汗流浹背蹂午。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工豆胸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人巷疼。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓晚胡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嚼沿。 傳聞我的和親對象是個殘疾皇子估盘,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容