EventBus3.0事件总线的基本使用

———————-基本使用————————- 导包

compile 'org.greenrobot:eventbus:3.0.0'

注册
在需要接收事件的activity中注册消息和反注册消息public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //在oncreate中订阅消息 EventBus.getDefault().register(this); setContentView(R.layout.activity_main); } @Override protected void onDestroy() { //在ondestry中取消订阅 EventBus.getDefault().unregister(this); super.onDestroy(); } }

发起事件
自定义一个类,用于传递数据和区分响应对象 public class Event { private String mMsg; public Event(String msg) { mMsg = msg; } public String getMsg(){ return mMsg; } }

在第二act中发起消息 public class Main2Activity extends AppCompatActivity {@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); }public void click(View view) { //发起事件 EventBus.getDefault().post(new Event("昨日一去不复回")); } }

在已经订阅的页面提供一个方法响应消息 public class MainActivity extends AppCompatActivity {private TextView tv_main_act; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initData(); initView(); }private void initData() { //在oncreate中订阅消息 EventBus.getDefault().register(this); }private void initView() { tv_main_act = (TextView) findViewById(R.id.tv_main_act); }public void jump(View view) { Intent intent = new Intent(this, Main2Activity.class); startActivity(intent); } //响应事件,通过参数区分响应对象,需要添加注解 @Subscribe @Subscribe public void onGetEvent(Event event) { String msg = "onEventMainThread收到了消息:" + event.getMsg(); tv_main_act.setText(msg); Toast.makeText(this, msg, Toast.LENGTH_LONG).show(); }@Override protected void onDestroy() { //在ondestry中取消订阅 EventBus.getDefault().unregister(this); super.onDestroy(); } }

———————-进阶使用———————— EventBus的线程模式
EventBus中的线程概念分为四种: //不论事件在哪个线程发起,都会在UI线程中响应 MainThread //不论在哪个线程发起都会在子线程中响应(若发起已经是子线程,就在本线程中响应) BackgroundThread //发起事件的线程和响应的线程是在同一个线程中 PostThread //创建新的子线程响应事件 Async在注解中指定运行的线程 @Subscribe(threadMode = ThreadMode.BACKGROUND) public void onEventBackgroundThread(Event2 event) { Log.v("meee",getClass()+":\n"+"子线程中响应:"+event.getMsg()+(Looper.myLooper()!=Looper.getMainLooper())); }

粘性事件
所谓的粘性事件,就是指在事件发起之后在注册的页面也可以接收到事件

@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)//使用注解指定粘性事件和事件模式; 在该注解下的方法,即使粘性事件被发起前没有注册,注册后仍然可以接收到事件,但只能接收到发起的最后一个粘性事件

//发起事件的页面中 public void click2(View view) { EventBus.getDefault().postSticky(new Event2("昨日一去不复回")); } //响应事件的页面 public class MainActivity extends AppCompatActivity{ oncreate(){ EventBus.getDefault().register(this); } //响应粘性事件 @Subscribe(sticky = true) public void onEventBackgroundThread(Event2 event) { Log.v("meee",getClass()+":\n"+"粘性事件响应"); } }

    推荐阅读