Android -- EventBus使用

EventBus

EventBus是一個Android端優化的publish/subscribe消息總線,簡化了應用程序內各組件間、組件與後臺線程間的通訊。好比請求網絡,等網絡返回時經過Handler或Broadcast通知UI,兩個Fragment之間須要經過Listener通訊,這些需求均可以經過EventBus實現。網絡

做爲一個消息總線,有三個主要的元素:ide

  • Event:事件
    • 能夠是任意類型的對象。
  • Subscriber:事件訂閱者,接收特定的事件
    • 在EventBus中,使用約定來指定事件訂閱者以簡化使用。即全部事件訂閱都都是以onEvent開頭的函數,具體來講,函數的名字是onEvent,onEventMainThread,onEventBackgroundThread,onEventAsync這四個,這個和ThreadMode有關。
  • Publisher:事件發佈者,用於通知Subscriber有事件發生
    • 能夠在任意線程任意位置發送事件,直接調用EventBus的`post(Object)`方法,能夠本身實例化EventBus對象,但通常使用默認的單例就行了:`EventBus.getDefault()`,根據post函數參數的類型,會自動調用訂閱相應類型事件的函數。

ThreadMode

每一個事件訂閱函數都是和一個`ThreadMode`相關聯的,ThreadMode指定了會調用的函數。有如下四個ThreadMode:函數

  • PostThread:事件的處理在和事件的發送在相同的進程,因此事件處理時間不該太長,否則影響事件的發送線程,而這個線程多是UI線程。對應的函數名是onEvent。
  • MainThread: 事件的處理會在UI線程中執行。事件處理時間不能太長,這個不用說的,長了會ANR的,對應的函數名是onEventMainThread。
  • BackgroundThread:事件的處理會在一個後臺線程中執行,對應的函數名是onEventBackgroundThread,雖然名字是BackgroundThread,事件處理是在後臺線程,但事件處理時間仍是不該該太長,由於若是發送事件的線程是後臺線程,會直接執行事件,若是當前線程是UI線程,事件會被加到一個隊列中,由一個線程依次處理這些事件,若是某個事件處理時間太長,會阻塞後面的事件的派發或處理。
  • Async:事件處理會在單獨的線程中執行,主要用於在後臺線程中執行耗時操做,每一個事件會開啓一個線程(有線程池),但最好限制線程的數目。

根據事件訂閱都函數名稱的不一樣,會使用不一樣的ThreadMode,好比果在後臺線程加載了數據想在UI線程顯示,訂閱者只需把函數命名爲onEventMainThread。post

使用流程

定義事件類型:優化

public class MyEvent {}

定義事件處理方法:this

public void onEventMainThread

註冊訂閱者:spa

EventBus.getDefault().register(this)

發送事件:線程

EventBus.getDefault().post(new MyEvent())

Sample

public class MainActivity extends ActionBarActivity {
    private ConditionVariable mConditionVariable;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mConditionVariable = new ConditionVariable();
        EventBus.getDefault().register(this);
        initUI();
        startActivity(new Intent(this, TwoActivity.class));
        new Thread(new SleepThread()).start();
    }

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

    TextView mTxtOne;

    private void initUI() {
        mTxtOne = (TextView) findViewById(R.id.txt_one);
    }

    public void onEventMainThread(EventOne eventOne) {
        Log.i("MainActivity", "MainActivity,,,onEventMainThread");
        mTxtOne.setText(eventOne.getString());
    }

//    public void onEventAsync(EventOne eventOne) {
//        Log.i("MainActivity", "onEventAsyc--->" + Thread.currentThread().getName());
//    }
//
//    public void onEventBackgroundThread(EventOne eventOne) {
//        Log.i("MainActivity", "onEventBackgroundThread--->" + Thread.currentThread().getName());
//    }

//    public void onEventPostThread(EventOne eventOne) {
//        Log.i("MainActivity", "onEventPostThread--->" + Thread.currentThread().getName());
//    }

    class SleepThread implements Runnable {

        @Override
        public void run() {
            Log.i("Activity", "MainActivity,,,SleepThread--->begin");
            mConditionVariable.block(2000);
            Log.i("Activity", "MainActivity,,,SleepThread--->end");
            EventBus.getDefault().post(new EventOne("11111"));
        }
    }

}

EventOne代碼:code

public class EventOne {
    String string;

    public EventOne(String string) {
        this.string = string;
    }

    public String getString() {
        return string;
    }
}
相關文章
相關標籤/搜索