[关闭]
@weidong 2017-07-16T10:48:45.000000Z 字数 4413 阅读 416

EventBus 使用

Android课程


http://www.jianshu.com/p/acfe78296bb5
http://www.cnblogs.com/whoislcj/p/5595714.html

配置

compile 'org.greenrobot:eventbus:3.0.0'

接收消息

Activity或Fragment生命周期方法里面进行注册,页面关闭需要取消

EventBus.getDefault().register(this);//注册
EventBus.getDefault().unregister(this);//解除注册

  1. public class MainActivity extends AppCompatActivity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.activity_main);
  6. EventBus.getDefault().register(this);
  7. }
  8. //接收一个String类型的消息
  9. @Subscribe
  10. public void onEvent(String msg){
  11. Toast.makeText(this, "msg" + msg, Toast.LENGTH_SHORT).show();
  12. }
  13. @Override
  14. protected void onDestroy() {
  15. super.onDestroy();
  16. EventBus.getDefault().unregister(this);
  17. }
  18. }

发送消息

发送成功后会执行MainActivity里面的onEvent方法

  1. public class SecondActivity extends AppCompatActivity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.activity_login);
  6. findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
  7. @Override
  8. public void onClick(View view) {
  9. //发送一个String类型的消息
  10. EventBus.getDefault().post(new MainMessage("我是消息");
  11. }
  12. });
  13. }
  14. }

发送自定义对象消息

构造一个自定义消息类

  1. public class MainMessage{
  2. private String message;
  3. public String getMessage() {
  4. return message;
  5. }
  6. public void setMessage(String message) {
  7. this.message = message;
  8. }
  9. }

发送自定义对象消息

  1. findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
  2. @Override
  3. public void onClick(View view) {
  4. MainMessage message = new MainMessage();
  5. message.setMessage("我是消息");
  6. EventBus.getDefault().post(message);
  7. }
  8. });

接收自定义对象消息

  1. public class MainActivity extends AppCompatActivity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.activity_main);
  6. EventBus.getDefault().register(this);
  7. }
  8. @Override
  9. protected void onDestroy() {
  10. super.onDestroy();
  11. EventBus.getDefault().unregister(this);
  12. }
  13. //接收自定义消息
  14. @Subscribe
  15. public void onMainMessage(MainMessage message) {
  16. Toast.makeText(this, "msg" + message.getMessage(), Toast.LENGTH_SHORT).show();
  17. }
  18. }

@Subscribe注解

上面演示的代码都用了@Subscribe注解,该注解标识了当前方法为订阅方法,我们可以给方法设置几个属性:

1. 方法运行的线程

  1. @Subscribe(threadMode = ThreadMode.MAIN) //在ui线程执行
  2. public void onMainMessage(MainMessage message) {
  3. Log.e(TAG, "msg" + message.getMessage());
  4. }

2. 优先级

事件的优先级类似广播的优先级,优先级越高优先获得消息

  1. @Subscribe(threadMode = ThreadMode.MAIN, priority = 100) //在ui线程执行 优先级100
  2. public void onMainMessage(MainMessage message) {
  3. Log.e(TAG, "msg" + message.getMessage());
  4. }

另外,发送有序广播可以终止广播的继续往下传递,EventBus也实现了此功能

  1. EventBus.getDefault().cancelEventDelivery(event) ;//优先级高的订阅者可以终止事件往下传递

3. sticky 粘性事件

关于粘性事件,可以参考Android的广播机制,其中有一个粘性广播,粘性广播的意思是:

该广播发送后,会保存在内存中,如果后来有注册的Receiver与之匹配,那么该Receiver便会接收到该广播。那么粘性事件同理,在注册之前便把事件发生出去,等到注册之后便会收到最近发送的粘性事件(必须匹配)。
注意:只会接收到最近发送的一次粘性事件,之前的会接收不到。

需要注解中添加sticky = true

  1. @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) //在ui线程执行,订阅事件为粘性事件
  2. public void onSticky(StickyEvent event) {
  3. Log.e(TAG, "收到粘性事件");
  4. }

4. 代码示例

  1. public class SecondActivity extends Activity implements View.OnClickListener {
  2. private static final String TAG = "SecondActivity";
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_second);
  7. Button button1 = findViewById(R.id.sendStickyMessageBtn1);
  8. Button button2 = findViewById(R.id.sendStickyMessageBtn2);
  9. Button button3 = findViewById(R.id.sendStickyMessageBtn3);
  10. Button button4 = findViewById(R.id.sendRegisterBtn);
  11. button1.setOnClickListener(this);
  12. button2.setOnClickListener(this);
  13. button3.setOnClickListener(this);
  14. button4.setOnClickListener(this);
  15. }
  16. @Override
  17. public void onClick(View v) {
  18. switch (v.getId()) {
  19. case R.id.sendStickyMessageBtn1:
  20. EventBus.getDefault().postSticky(new StickyEvent("粘性事件1"));
  21. Log.e(TAG, "发送粘性事件1...");
  22. break;
  23. case R.id.sendStickyMessageBtn2:
  24. EventBus.getDefault().postSticky(new StickyEvent("粘性事件2"));
  25. Log.e(TAG, "发送粘性事件2...");
  26. break;
  27. case R.id.sendStickyMessageBtn3:
  28. EventBus.getDefault().postSticky(new StickyEvent("粘性事件3"));
  29. Log.e(TAG, "发送粘性事件3...");
  30. break;
  31. case R.id.sendRegisterBtn:
  32. Log.e(TAG, "注册,接收粘性事件...");
  33. EventBus.getDefault().register(this);
  34. break;
  35. }
  36. }
  37. @Subscribe(sticky = true)
  38. public void onEvent(StickyEvent messageEvent) {
  39. Log.d("cylog", "接受到了来自EventBus的事件:" + messageEvent.getMessage());
  40. }
  41. @Override
  42. protected void onDestroy() {
  43. super.onDestroy();
  44. EventBus.getDefault().unregister(this);
  45. }
  46. }

依次点击按钮,执行结果如下:
image.png-10.6kB

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注