Android EventBus你需要了解的都在这

Android EventBus你需要了解的都在这

什么是EventBus

EventBus是一个Android事件发布/订阅的轻量级框架,基于观察者模式,将事件的接收者和发送者分离,主要是替代intent,Handler,BroadCast在Fragment,activity,service线程之间传递消息。作为GitHub上的人气开源项目,截止现在(2020-04-26)已经有22.4k个star。

EventBus-GitHub

集成

    implementation 'org.greenrobot:eventbus:3.1.1'

Event基本用法

Event的用法非常简介,一般我们使用分为五个步骤:

  1. 定义一个事件类
public class MessageEvent{
    ···
}
  1. 订阅事件
EventBus.getDefault().register(this);
  1. 发送事件
EventBus.getDefault().post(new MessageEvent())
  1. 处理事件
    @Subscribe(threadMode = ThreadMode.MAIN)
    fun XXX(MessageEvent messageEvent){
        ···
    }

方法名可以随意取,但需要添加一个@Subscribe注解,注解中ThreadMode.MAIN是指定运行在主线程中的线程模型,这个后面细讲。

  1. 注销订阅事件
EventBus.getDefault().unregister(this);

EventBus应用举例

public class MainActivity extends AppCompatActivity {
//第一个界面

    private TextView tv_message;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        EventBus.getDefault().register(this);//注册
        tv_message = findViewById(R.id.tv_message);
        findViewById(R.id.bn_main).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(new Intent(MainActivity.this,SecondActivity.class));
            }
        });
    }
    @Subscribe(threadMode = ThreadMode.MAIN)//需要加上注解
    public void  onEventMainThred(MyEvent event){
       tv_message.setText(event.getEvent())
   }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);//注销
    }
}
//第二个界面
public class SecondActivity extends Activity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.bn_main).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                MyEvent myEvent = new MyEvent();
                myEvent.setEvent("hello");
                EventBus.getDefault().post(myEvent);
                finish();
            }
        });
    }
}
//消息源
public class MyEvent {
    private String event;

    public String getEvent() {
        return event;
    }

    public void setEvent(String event) {
        this.event = event;
    }
}

在SecondActivity的按钮点击事件中,点击后回到MainActivity,并且MainActivity中的TextView的内容也变成了hello。

从这个例子中,可以看出:EventBus的功能类似于观察者模式和广播,但是比起重量级的广播,EventBus减少了复杂的调用和对象序列化的开销,并且解耦了发布者和订阅者之间的关系,在代码结构上也更加清晰简单。

EventBus的三要素

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

EventBus的四种线程模型

EventBus的线程模型就是我们在事件订阅时,在Subscriber注解中设置的变量,其中:

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

EventBus的粘性事件

EventBus除了可以发送普通事件,还可以支持发送粘性事件,就是先发送事件之后再订阅事件也能收到该事件,类似于粘性广播,示例代码如下:

1.订阅者处理粘性事件

    @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
    fun XXX(MessageEvent messageEvent){
        ···
    }

2.发送粘性事件

EventBus.getDefault().postSticky(new MessageEvent())

代码经过这样的处理,就可以先发送事件,在订阅事件EventBus.getDefault().register(this);时,进行事件处理。

EventBus的优先级

在Subscribe注解中总共有3个参数,上面我们用到了其中的两个,这里我们使用以下第三个参数,即priority。它用来指定订阅方法的优先级,是一个整数类型的值,默认是0,值越大表示优先级越大。在某个事件被发布出来的时候,优先级较高的订阅方法会首先接受到事件。

为了对优先级进行测试,这里我们需要对上面的代码进行一些修改。这里,我们使用一个布尔类型的变量来判断是否应该取消事件的分发。我们在一个较高优先级的方法中通过该布尔值进行判断,如果未true就停止该事件的继续分发,从而通过低优先级的订阅方法无法获取到事件来证明优先级较高的订阅方法率先获取到了事件。

原创文章 8 获赞 9 访问量 878

猜你喜欢

转载自blog.csdn.net/weixin_40303382/article/details/105770946