手把手教你使用EventBus

EventBus是什么?

EventBus由greenrobot組織貢獻(xiàn)(該組織還貢獻(xiàn)了greenDAO),一個(gè)Android事件發(fā)布/訂閱輕量級框架,下面來一張圖作為說明。

EventBus說明

EventBus有什么用?

  • 我們可以通過解耦發(fā)布者和訂閱者簡化Android事件傳遞。

  • EventBus可以代替Android傳統(tǒng)的Intent,Handler,Broadcast或接口函數(shù),在Fragment,Activity,Service線程之間傳遞數(shù)據(jù),執(zhí)行方法。

  • 使代碼簡單

  • 快,高性能:特別是在注重性能的Android上。也許在其同類的解決方案是最快的。

  • ?。╦ar包小于50K),但是強(qiáng)大:EventBus是一個(gè)很小的庫,它的API超級簡單。

  • android主線程傳遞:當(dāng)和UI交互的時(shí)候,無論這個(gè)事件是怎么提交的,EventBus都可以在主線程傳遞事件。

如何使用

首先在你的項(xiàng)目中添加eventbus的依賴

compile 'org.greenrobot:eventbus:3.0.0'

這里給大家舉一個(gè)例子,MainActivity打開CommonActivity,在CommonActivity發(fā)出一個(gè)事件,然后MainActivity做出相應(yīng)的反饋。

package cn.lxt.stickeventbus;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //首先要在你要接受EventBus的界面注冊,這一步很重要
        EventBus.getDefault().register(this);
        Button btnCommon = (Button) findViewById(R.id.btn_common);
        btnCommon.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {          
            case R.id.btn_common:
                //點(diǎn)擊按鈕進(jìn)入CommonActivity
                CommonActivity.start(this);
                break;
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //在界面銷毀的地方要解綁
        EventBus.getDefault().unregister(this);
    }

    //任意寫一個(gè)方法,給這個(gè)方法一個(gè)@Subscribe注解,參數(shù)類型可以自定義,但是一定要與你發(fā)出的類型相同
    @Subscribe
    public void getEventBus(Integer num) {
        if (num != null) {
            //這里拿到事件之后吐司一下
            Toast.makeText(this, "num" + num, Toast.LENGTH_SHORT).show();
        }
    }
}

接下來就是在CommonActivity里面

package cn.lxt.stickeventbus;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

import org.greenrobot.eventbus.EventBus;

/**
 * Created by Administrator on 2017/8/16 0016.
 */

public class CommonActivity extends AppCompatActivity implements View.OnClickListener {

    public static void start(Context context) {
        context.startActivity(new Intent(context, CommonActivity.class));
    }

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_common);
        Button button = (Button) findViewById(R.id.btn_send);
        button.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_send:
                //點(diǎn)擊按鈕,發(fā)送一個(gè)int類型的事件
                EventBus.getDefault().post(666);
                finish();
                break;
        }
    }
}

接下來給大家看效果圖


666

大家可以清晰的看到,666彈出來了。當(dāng)然,EventBus之所以好用,自然有他的強(qiáng)大之處,比如說,我在子線成發(fā)送的消息,在接受的地方切換到主線程,只需要增加一個(gè)參數(shù)即可,那么接下來就要說到線程模式了。

線程模式

我們把發(fā)送消息放到子線程,把接收消息放到主線程并且更新UI。

CommonActivity 里面發(fā)送消息放到子線程
 new Thread(new Runnable() {
                    @Override
                    public void run() {
                        EventBus.getDefault().post(666);
                        finish();
                    }
                }).start();
MainActivity里面接收事件,只需要指定線程模式即可,即threadMode = ThreadMode.MAIN
  @Subscribe(threadMode = ThreadMode.MAIN)
    public void getEventBus(Integer num) {
        if (num != null) {
            Toast.makeText(this, "num" + num, Toast.LENGTH_SHORT).show();
        }
    }

相信大家看到了EventBus的強(qiáng)大之處,EventBus有4種線程模式,POSTING,MAIN,BACKGROUND,ASYNC,默認(rèn)線程是POSTING。

POSTING

默認(rèn)情況下,EventBus使用的就是這個(gè)模式,說白了就是你在哪個(gè)線程發(fā)送事件,就在哪個(gè)線程接收事件。

MAIN

相信大家剛才也能看到,MAIN就是將接受事件放到主線程執(zhí)行。

BACKGROUND

在后臺線程接收事件。如果不是在主線程提交,事件處理方法會直接在提交線程被調(diào)用。如果是在主線程提交,EventBus使用一個(gè)單獨(dú)的后臺線程按順序傳遞所有事件。事件處理使用這種模式應(yīng)該能夠盡快返回避免阻塞后臺線程。

ASYNC

在一個(gè)單獨(dú)的線程接收事件。這個(gè)線程通常和提交的線程和主線程是獨(dú)立的。提交的事件從不等待事件處理方法。事件處理方法如果需要花費(fèi)一段時(shí)間比如訪問網(wǎng)絡(luò)應(yīng)該使用這種模式。避免在同一時(shí)間觸發(fā)大量長時(shí)間異步的處理方法來限制并發(fā)的線程。EventBus使用一個(gè)線程池來有效重復(fù)利用線程完成的異步事件處理程序的通知。

Stick Event

前面也說到了,EventBus可以取代intent在Activity或者Fragment中傳值,我們?nèi)绻们懊婺菢觽髦悼隙ㄊ遣恍械?,?yīng)該怎么做呢?這時(shí)候就要用到EventBus另外一個(gè)功能了,Stick Event,那么接下來就給大家?guī)鞸tick Event的使用。

package cn.lxt.stickeventbus;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btnStick = (Button) findViewById(R.id.btn_stick);
        btnStick.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_stick:
                //點(diǎn)擊按鈕,跳轉(zhuǎn)到StickActivity并攜帶參數(shù),參數(shù)類型為String
                EventBus.getDefault().postSticky("我是黏性事件");
                StickActivity.start(this);
                break; 
        }
    }
}
package cn.lxt.stickeventbus;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;

import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;

/**
 * Created by Administrator on 2017/8/16 0016.
 */

public class StickActivity extends AppCompatActivity {

    public static void start(Context context) {
        context.startActivity(new Intent(context, StickActivity.class));
    }

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_stick);
        //前面也說了,在任何你要接收事件的地方都要先注冊
        EventBus.getDefault().register(this);
    }

    //同樣的,自定義一個(gè)方法,加上 @Subscribe,不同的是在后面再加上一句sticky = true告訴EventBus這是一個(gè)粘性事件
    @Subscribe(sticky = true)
    public void getEventBus(String str) {
        Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //別忘了在onDestroy里面解綁
        EventBus.getDefault().unregister(this);
    }
}

接下來還是大家看一下效果圖

接收到事件了

在進(jìn)入StickActivity 之后,我們接收到了MainActivity發(fā)出的事件。

總結(jié)

EventBus的使用就說到這里,基本能滿足大家日常開發(fā)的需求了,文章中如果有任何錯(cuò)誤歡迎指出,共同學(xué)習(xí)共同進(jìn)步,當(dāng)然如果有任何疑問,也歡迎留言。

以上純屬于個(gè)人平時(shí)工作和學(xué)習(xí)的一些總結(jié)分享,如果有什么錯(cuò)誤歡迎隨時(shí)指出,大家可以討論一起進(jìn)步。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,725評論 25 709
  • title: android 初識EventBusdate: 2016-04-17tags: eventbus E...
    梵依然閱讀 4,472評論 7 107
  • 目錄 1.概述 2.實(shí)戰(zhàn) 1.基本框架搭建 2.新建一個(gè)類FirstEvent 3.在要接收消息的頁面注冊Even...
    慕涵盛華閱讀 10,615評論 2 16
  • EventBus 是一個(gè)Android端優(yōu)化的 publish/subscribe 消息總線,簡化了應(yīng)用程序各個(gè)組...
    王世軍Steven閱讀 1,938評論 4 21
  • 今天我要和大家講講在世上最繁華那片大森林里,我的一個(gè)朋友,來自鄉(xiāng)下的姑娘——小白兔。 她正直又善良,懷揣著夢想, ...
    桃樂絲_閱讀 490評論 0 0

友情鏈接更多精彩內(nèi)容