什么是EventBus

01 前言

当我们进行项目开发的时候,往往是需要应用程序的各组件、组件与后台线程间进行通信,比如在子线程中进行请求数据,当数据请求完毕后通过Handler或者是广播通知UI,而两个Fragment之家可以通过Listener进行通信等等。当我们的项目越来越复杂,使用Intent、Handler、Broadcast进行模块间通信、模块与后台线程进行通信时,代码量大,而且高度耦合。现在就让我们来学习一下EventBus 3.0吧。

02 什么是EventBus

EventBus Github地址
进入官网,看看人家是怎么解释的:

  • simplifies the communication between components
    decouples event senders and receivers
    performs well with Activities, Fragments, and background threads
    avoids complex and error-prone dependencies and life cycle issues
  • makes your code simpler
  • is fast
  • is tiny (~50k jar)
  • is proven in practice by apps with 100,000,000+ installs
  • has advanced features like delivery threads, subscriber priorities, etc.

大概的意思就是:EventBus能够简化各组件间的通信,让我们的代码书写变得简单,能有效的分离事件发送方和接收方(也就是解耦的意思),能避免复杂和容易出错的依赖性和生命周期问题。

03 关于EventBus的概述

三要素

  • Event 事件。它可以是任意类型。
  • Subscriber 事件订阅者。在EventBus3.0之前我们必须定义以onEvent开头的那几个方法,分别是onEvent、onEventMainThread、onEventBackgroundThread和onEventAsync,而在3.0之后事件处理的方法名可以随意取,不过需要加上注解@subscribe(),并且指定线程模型,默认是POSTING。
  • Publisher 事件的发布者。我们可以在任意线程里发布事件,一般情况下,使用EventBus.getDefault()就可以得到一个EventBus对象,然后再调用post(Object)方法即可。

四种线程模型

EventBus3.0有四种线程模型,分别是:

  • POSTING (默认) 表示事件处理函数的线程跟发布事件的线程在同一个线程。
  • MAIN 表示事件处理函数的线程在主线程(UI)线程,因此在这里不能进行耗时操作。
  • BACKGROUND 表示事件处理函数的线程在后台线程,因此不能进行UI操作。如果发布事件的线程是主线程(UI线程),那么事件处理函数将会开启一个后台线程,如果果发布事件的线程是在后台线程,那么事件处理函数就使用该线程。
  • ASYNC 表示无论事件发布的线程是哪一个,事件处理函数始终会新建一个子线程运行,同样不能进行UI操作。

04 EventBus的基本用法

举个例子,我需要在一个Activity里注册EventBus事件,然后定义接收方法,这跟Android里的广播机制很像,你需要首先注册广播,然后需要编写内部类,实现接收广播,然后操作UI。所以,在EventBus中,你同样得这么做。

自定义一个事件类

 
  1. public class MessageEvent{

  2. private String message;

  3. public MessageEvent(String message){

  4. this.message=message;

  5. }

  6. public String getMessage() {

  7. return message;

  8. }

  9.  
  10. public void setMessage(String message) {

  11. this.message = message;

  12. }

  13. }

这里有些同学,会有一些疑问,为什么要建立这样一个类,有什么用途。其实这个类就是一个Bean类,里面定义用来传输的数据的类型。

注册事件

 
  1. @Override

  2. protected void onCreate(Bundle savedInstanceState) {

  3. super.onCreate(savedInstanceState);

  4. setContentView(R.layout.activity_main);

  5. EventBus.getDefault().register(this);

  6. }

当我们需要在Activity或者Fragment里订阅事件时,我们需要注册EventBus。我们一般选择在Activity的onCreate()方法里去注册EventBus,在onDestory()方法里,去解除注册。

解除注册

 
  1. @Override

  2. protected void onDestroy() {

  3. super.onDestroy();

  4. EventBus.getDefault().unregister(this);

  5. }

发送事件

EventBus.getDefault().post(messageEvent);

处理事件

 
  1. @Subscribe(threadMode = ThreadMode.MAIN)

  2. public void XXX(MessageEvent messageEvent) {

  3. ...

  4. }

前面我们说过,处理消息的方法名字可以随便取。但是需要加一个注解@Subscribe,并且要指定线程模型。

05 EventBus使用实战

以上我们讲了EventBus的基本用法,没有用过的同学也不要担心不会用,小编在这里举个小栗子。

第一步:添加依赖

 compile 'org.greenrobot:eventbus:3.0.0'

第二步:定义消息事件类

 
  1. public class MessageEvent{

  2. private String message;

  3. public MessageEvent(String message){

  4. this.message=message;

  5. }

  6.  
  7. public String getMessage() {

  8. return message;

  9. }

  10.  
  11. public void setMessage(String message) {

  12. this.message = message;

  13. }

  14. }

第三步:注册和解除注册

分别在FirstActivity的onCreate()方法和onDestory()方法里,进行注册EventBus和解除注册。

 
  1. package com.example.lenovo.testapp.ui;

  2.  
  3. import android.content.Intent;

  4. import android.os.Bundle;

  5. import android.support.annotation.Nullable;

  6. import android.support.v7.app.AppCompatActivity;

  7. import android.view.View;

  8. import android.widget.Button;

  9. import android.widget.TextView;

  10.  
  11. import com.example.lenovo.testapp.R;

  12. import com.example.lenovo.testapp.event.MessageEvent;

  13.  
  14. import org.greenrobot.eventbus.EventBus;

  15. import org.greenrobot.eventbus.Subscribe;

  16. import org.greenrobot.eventbus.ThreadMode;

  17.  
  18. /**

  19. * Created by ZZG on 2018/1/10.

  20. */

  21.  
  22. public class FirstActivity extends AppCompatActivity {

  23. private Button mButton;

  24. private TextView mText;

  25. @Override

  26. protected void onCreate(@Nullable Bundle savedInstanceState) {

  27. super.onCreate(savedInstanceState);

  28. setContentView(R.layout.first_activity);

  29. mButton = (Button) findViewById(R.id.btn1);

  30. mText = (TextView) findViewById(R.id.tv1);

  31. mText.setText("今天是星期三");

  32. EventBus.getDefault().register(this);

  33. jumpActivity();

  34. }

  35.  
  36. private void jumpActivity() {

  37.  
  38. mButton.setOnClickListener(new View.OnClickListener() {

  39. @Override

  40. public void onClick(View v) {

  41. Intent intent=new Intent(FirstActivity.this,SecondActivity.class);

  42. startActivity(intent);

  43. }

  44. });

  45. }

  46.  
  47.  
  48. @Subscribe(threadMode = ThreadMode.MAIN)

  49. public void Event(MessageEvent messageEvent) {

  50. mText.setText(messageEvent.getMessage());

  51. }

  52.  
  53. @Override

  54. protected void onDestroy() {

  55. super.onDestroy();

  56. if(EventBus.getDefault().isRegistered(this)) {

  57. EventBus.getDefault().unregister(this);

  58. }

  59. }

  60.  
  61. }

  62.  

事件处理

在这里,事件的处理线程在主线程,是因为,我要让TextView去显示值。
在 SecondActivity里去进行事件的发送。

 
  1. package com.example.lenovo.tezs;

  2.  
  3. import android.os.Bundle;

  4. import android.support.annotation.Nullable;

  5. import android.support.v7.app.AppCompatActivity;

  6. import android.view.View;

  7. import android.widget.Button;

  8.  
  9. import org.greenrobot.eventbus.EventBus;

  10.  
  11. /**

  12. * Created by ZZG on 2018/1/10.

  13. */

  14.  
  15. public class SecondActivity extends AppCompatActivity {

  16. private Button mButton2;

  17. @Override

  18. protected void onCreate(@Nullable Bundle savedInstanceState) {

  19. super.onCreate(savedInstanceState);

  20. setContentView(R.layout.second_activity);

  21. mButton2=(Button) findViewById(R.id.btn2);

  22. jumpActivity();

  23. }

  24.  
  25. private void jumpActivity() {

  26. mButton2.setOnClickListener(new View.OnClickListener() {

  27. @Override

  28. public void onClick(View v) {

  29. EventBus.getDefault().post(new MessageEvent("欢迎大家浏览我写的博客"));

  30. finish();

  31. }

  32. });

  33. }

  34. }

  35.  

很简单,当点击按钮的时候,发送了一个事件。

运行程序。

什么是EventBus_第1张图片

1.PNG

 

 

在FirstActivity中,左边是一个按钮,点击之后可以跳转到SecondActivity,在按钮的右边是一个TextView,用来进行结果的验证。

什么是EventBus_第2张图片

2.PNG

这是SecondActivity,在页面的左上角,是一个按钮,当点击按钮,就会发送了一个事件,最后这个Activity就会销毁掉。

 

什么是EventBus_第3张图片

3.PNG

 

此时我们可以看到,FirstActivity里的文字已经变成了,我们在SecondActivity里设置的文字。

总结

经过这个简单的例子,我们发现EventBus使用起来是如此的方便,当我们的代码量变得很多的时候,使用EventBus后你的逻辑非常的清晰,并且代码之间高度解耦,在进行组件、页面间通信的时候,EventBus是一个不错的选择。

你可能感兴趣的:(什么是EventBus)