天天看點

EventBus的使用(非常好用,非常簡單,大道至簡)

用于元件間的通訊,程序間的通訊,線程間的通訊,無所不能的通訊

事件釋出訂閱總線,原理:2.x使用反射機制影響性能;3.0使用EventBusAnnotationProcessor注解處理器在編譯期通過讀取@Subscribe()注解并解析、處理其中所包含的資訊,然後生成java類來儲存所有訂閱者關于訂閱的資訊,這樣就比在運作時使用反射來獲得這些訂閱者的資訊速度要快

用法:

1建立對象

public static class MessageEvent { /* Additional fields if needed / }

2發送對象:EventBus.getDefault().post(new MessageEvent());

3接收對象:

@Subscribe(threadMode = ThreadMode.MAIN)

public void onMessageEvent(MessageEvent event) {/ Do something */};

PS能夠接收對象的前提的是已經在接收事件的類裡注冊,當然也不要忘記解注冊

@Override

public void onStart() {

super.onStart();

EventBus.getDefault().register(this);

}

@Override

public void onStop() {

super.onStop();

EventBus.getDefault().unregister(this);

}

在gradle中 添加compile就不說了

compile ‘org.greenrobot:eventbus:3.1.1’

對于的解釋:threadMode

EventBus的@Subscribe訂閱的線程有四種模式:

1Thread.PostThread預設方式,在發送這post線程中執行【常用】(發送者是主線程訂閱者就是主線程,發送者post是子線程訂閱者Subscribe就是子線程)

2ThreadMode.MainThread 在主線程(UI線程)中執行【常用】(跟發送者post無關,訂閱者subscribe都是在主線程中執行)

3ThreadMode.BackGroundThread在子線程(背景線程)中執行(如果事件在主線程釋出則new一個子線程執行,如果事件在子線程中釋出則在目前子線程中執行)

4ThreadMode.Async強制在背景執行(無論事件在哪個線程釋出,都會new一個子線程執行)

拓展:

EventBus 3.0 函數名字不再受到權限,而且可以在一個函數中展現出在哪個線程執行,并且可指定接收事件的優先級

/**

* 普通事件

* @param event

*/

@Subscribe(threadMode = ThreadMode.MAIN, priority = 100)

public void onDataSynEvent(DataSynEvent event) {

}

/**
 * 粘性事件
 * @param event
 */
@Subscribe(threadMode = ThreadMode.MAIN, priority = 100, sticky = true) 
public void onDataSynEvent(DataSynEvent event) {
   
}
      

上例子

EventBus.getDefault().post(mMessageEvent);
      
@Subscribe(threadMode = ThreadMode.MAIN)
    public void onMessageEvent(MessageEvent event) {
        /* Do something */
        tvServiceCommunication.setText("EventBus線程通訊獲得子線程的資料:" + event.mMessagecount + "");
    }
      
package com.blzt.register.eventbus;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.SystemClock;
import android.util.Log;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.blzt.register.R;
import com.blzt.register.aidl.MyService;

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

import java.util.Timer;

//EventBus實作線程間通訊
public class EventBusActivity extends Activity implements View.OnClickListener {

    private TextView tvServiceCommunication;
    private LinearLayout golayout;
    int count = 0;
    private Timer mTimer;
    MessageEvent mMessageEvent;


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

        tvServiceCommunication = (TextView) findViewById(R.id.tv_service_communication);
        golayout = (LinearLayout) findViewById(R.id.golayout);
        findViewById(R.id.bt_go1).setOnClickListener(this);
        findViewById(R.id.bt_go2).setOnClickListener(this);
        findViewById(R.id.bt_go3).setOnClickListener(this);
        findViewById(R.id.bt_go4).setOnClickListener(this);
        mMessageEvent = new MessageEvent();


    }

    @Override
    public void onStart() {
        super.onStart();
        EventBus.getDefault().register(this);

    }

    @Override
    public void onStop() {
        super.onStop();
        EventBus.getDefault().unregister(this);
    }

    /*
  ThreadMode.MAIN--不論發送者是主線程還是子線程。我們都在主線程執行相應操作
  ThreadMode.POSTING---在發送者的線程中執行
  ThreadMode.BACKGROUND----如果釋出者就是子線程,那麼直接在釋出者的子線程執行,如果釋出者是主線程,則直接new一個新的子線程執行
  ThreadMode.ASYNC----無論事件在哪個線程釋出,都會建立新的子線程在執行
   */
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMessageEvent(MessageEvent event) {
        /* Do something */
        tvServiceCommunication.setText("EventBus線程通訊獲得子線程的資料:" + event.mMessagecount + "");
    }

    ;
    Thread mThread = null;
    boolean isStop = false;

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.bt_go1:
                //TODO implement
                mThread = new MyThread();
                mThread.start();
                isStop = false;
//               new MyThread().start();

                break;
            case R.id.bt_go2:
                //TODO implement
//                mThread.stop();
                isStop = true;
                mThread = null;
                break;
            case R.id.bt_go3:
                //TODO implement
                Log.e("wy", "start service: ");
                Intent mIntent = new Intent(this, MyService.class);
                startService(mIntent);
                break;
            case R.id.bt_go4:
                //TODO implement
                break;
        }
    }

    private class MyThread extends Thread {
        @Override
        public void run() {
            super.run();

            while (!isStop) {
                SystemClock.sleep(500);
                count++;

                mMessageEvent.mMessagecount = count;
                EventBus.getDefault().post(mMessageEvent);
                Log.w("wy", "run: " + count);
            }
        }
    }
}

      
package com.blzt.register.eventbus;

public class MessageEvent {
   public int mMessagecount;
}