天天看點

Android -- EventBus

使用EvnetBus可以實作Android各大元件之間的通信(跨程序呢?應該不能。但是廣播就可以。)

第一步:下載下傳 EventBus 類,

​​https://github.com/greenrobot/EventBus​​,也可以直接下載下傳我打包的jar包

第二步:訂閱事件:

              EventBus mEventBus = EventBus.getDefault();

              mEventBus.register(this);

第三步:1. 編寫響應函數,需要自定義事件類,EventOne

              public void onEvent(EventOne event){    

              }

第四步:釋出事件

            EventBus.getDefault().post(new EventOne());

public class MainActivity extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final EventBus bus = new EventBus();
    bus.register(this);

    new Thread() {

      @Override
      public void run() {
        super.run();
        try {
          sleep(10000);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
        bus.post(new EventOne("this is a test event"));
      }
    }.start();
  }

  public void onEvent(EventOne event) {
    System.out.println("@@@@ recv " + event.getEvent());
  }

}      

onEvent:如果使用onEvent作為訂閱函數,那麼該事件在哪個線程釋出出來的,onEvent就會在這個線程中運作,也就是說釋出事件和接收事件線程在同一個線程。使用這個方法時,在onEvent方法中不能執行耗時操作,如果執行耗時操作容易導緻事件分發延遲。

onEventMainThread:如果使用onEventMainThread作為訂閱函數,那麼不論事件是在哪個線程中釋出出來的,onEventMainThread都會在UI線程中執行,接收事件就會在UI線程中運作,這個在Android中是非常有用的,因為在Android中隻能在UI線程中跟新UI,是以在onEvnetMainThread方法中是不能執行耗時操作的。

onEventBackground:如果使用onEventBackgrond作為訂閱函數,那麼如果事件是在UI線程中釋出出來的,那麼onEventBackground就會在子線程中運作,如果事件本來就是子線程中釋出出來的,那麼onEventBackground函數直接在該子線程中執行。

onEventAsync:使用這個函數作為訂閱函數,那麼無論事件在哪個線程釋出,都會建立新的子線程在執行onEventAsync.

上面一段轉的 EventBus使用詳解(二)——EventBus使用進階

如果事件函數的參數和post的參數一樣則該事件函數就會被調用。寫了多個事件函數,則這些事件函數都會被調用。

繼續閱讀