一、概述
我们在进行平时的项目开发中,基本上需求都要实现应用程序组件之间的通信,比如在子线程间进行请求数据,当数据请求完毕后通过Handler消息机制来更新UI,当我们项目开发的时间久了会越来越复杂,代码也是会越来越多,那么改如何解决呢,EventBus就帮我们解决了模块与后台线程进行通讯的问题,而且高度耦合。
那么什么是EventBus呢?
EventBus能够简化各组件间的通信,让我们的代码书写变的简单,能有效的分离事件发送方和接受方(也就是解耦的意思),能避免复杂和容易出错的依赖性和生命后期的问题。
二、四种线程模型
1、POSTING(默认)表示事件处理函数的线程跟发布事件的线程在同一个线程。
2、MAIN 表示事件处理函数的线程在主线程(UI)线程,因此在这里不能进行耗时操作。
3、BACKGROUND 表示事件处理函数的线程在后台线程,因此不能进行UI操作。如果发布事件的线程是主线程(UI线程),那么事件处理函数将会开启一个后台线程,如果发布事件的线程是在后台线程,那么事件处理函数就使用该线程。
4、ASYNC 表示无论事件发布的线程是哪一个,事件处理函数始终会新建一个子线程运行,同样不能运行UI操作。
三、基本用法
1、自定义一个事件类,说白了也就是JavaBean类
package com.zero.cui.eventbusdemo; /** * Created by y on 2018/5/8. */ //定义消息事件类 public class MessageEvent { private String message; public MessageEvent(String message){ this.message = message; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
2、注册事件
一般都是写在接受消息的Activity类中onCreate方法中
//注册 EventBus.getDefault().register(this);
public class FirstActivity extends AppCompatActivity { private Button mButton; private TextView mText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_first); mButton = (Button) findViewById(R.id.btn1); mText = (TextView) findViewById(R.id.tv1); mText.setText("第一个Activity"); //注册 EventBus.getDefault().register(this); jumpActivity(); }
3、解除注册
写到onDestroy销毁的方法里
//解除注册 EventBus.getDefault().unregister(this);
@Override protected void onDestroy() { super.onDestroy(); // (如果是已经注册的,就解除注册。) if (EventBus.getDefault().isRegistered(this)) { //解除注册 EventBus.getDefault().unregister(this); } } }
4、发送事件
//发送事件 EventBus.getDefault().post(new MessageEvent("第二个Activity里发送的消息"));
5、处理事件
加上 @Subscribe 注解后,方法名字可以任意取
//处理事件的方法,加上一个注册@Subscribe,并且要指定线程模型,名字可以随便起。 @Subscribe(threadMode = ThreadMode.MAIN) public void Event(MessageEvent messageEvent){ mText.setText(messageEvent.getMessage()); }
四、理论说完上代码
Bean 实体类
package com.zero.cui.eventbusdemo; /** * Created by y on 2018/5/8. */ //定义消息事件类 public class MessageEvent { private String message; public MessageEvent(String message){ this.message = message; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
第一个Activity
package com.zero.cui.eventbusdemo; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; public class FirstActivity extends AppCompatActivity { private Button mButton; private TextView mText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_first); mButton = (Button) findViewById(R.id.btn1); mText = (TextView) findViewById(R.id.tv1); mText.setText("第一个Activity"); //注册 EventBus.getDefault().register(this); jumpActivity(); } //跳转页面的方法 private void jumpActivity(){ mButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(FirstActivity.this,SecondActivity.class); startActivity(intent); } }); } // 四种线程模型 // POSTING (默认) 表示事件处理函数的线程跟发布事件的线程在同一个线程。 // MAIN 表示事件处理函数的线程在主线程(UI)线程,因此在这里不能进行耗时操作。 // BACKGROUND 表示事件处理函数的线程在后台线程,因此不能进行UI操作。如果发布事件的线程是主线程(UI线程),那么事件处理函数将会开启一个后台线程,如果果发布事件的线程是在后台线程,那么事件处理函数就使用该线程。 // ASYNC 表示无论事件发布的线程是哪一个,事件处理函数始终会新建一个子线程运行,同样不能进行UI操作。 //处理事件的方法,加上一个注册@Subscribe,并且要指定线程模型,名字可以随便起。 @Subscribe(threadMode = ThreadMode.MAIN) public void Event(MessageEvent messageEvent){ mText.setText(messageEvent.getMessage()); } @Override protected void onDestroy() { super.onDestroy(); // (如果是已经注册的,就解除注册。) if (EventBus.getDefault().isRegistered(this)) { //解除注册 EventBus.getDefault().unregister(this); } } }
第二个Activity
package com.zero.cui.eventbusdemo; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import org.greenrobot.eventbus.EventBus; //进行事件的发送 public class SecondActivity extends AppCompatActivity { private Button mButton2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); mButton2 = (Button) findViewById(R.id.btn2); jumpActivity(); } private void jumpActivity(){ mButton2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //发送事件 EventBus.getDefault().post(new MessageEvent("第二个Activity里发送的消息")); finish(); } }); } }