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;
}


版权声明:本文为xiyangyang8110原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。