Android EventBus的使用

2021-11-02  本文已影响0人  mage1160

一、发送普通消息

第一步:

添加依赖:implementation 'org.greenrobot:eventbus:3.1.1'

第二步:

注册监听: EventBus.getDefault().register(this);

第三步:

反注册监听:EventBus.getDefault().register(this);

第四步:

构造发送消息类,并发送消息

第五步:

接收消息(四种)

第一种:主线程处理: ThreadMode.MAIN

        首先去判断当前如果是UI线程,则直接调用;否则: mainThreadPoster.enqueue(subscription, event);把当前的方法加入到队列,然后直接通过handler去发送一个消息,在handler的handleMessage中,去执行我们的方法。说白了就是通过Handler去发送消息,然后执行的。

第二种:后台处理,也就是子线程处理,不可并发ThreadMode.BACKGROUND

        如果当前非UI线程,则直接调用;如果是UI线程,则将任务加入到后台的一个队列,最终由Eventbus中的一个线程池去调用

executorService = Executors.newCachedThreadPool();。

第三种:后台处理,可以并发执行, ThreadMode.ASYNC

        将任务加入到后台的一个队列,最终由Eventbus中的一个线程池去调用;线程池与BackgroundThread用的是同一个。

第四种:发送和接收在同一个线程中处理。ThreadMode.POSTING

        对应表示该方法和消息发送发是在同一个线程中执行。

对应的代码:EventActivity跳转到SendMessageActivity页面, SendMessageActivity往EventActivity页面发送消息

EventActivity

onCreate的方法里 进行注册

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

onDestroy的方法里 进行反注册

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

创建发送消息的类

public class MyMessage {

    private Stringmessage;

    public String getMessage() {

        return message;

    }

    public void setMessage(String message) {

        this.message = message;

    }

}

EventActivity 中接收消息

//事件处理:方法名自定义,参数必须为当前消息的类型

//threadMode有四种类型(MAIN、POSTING、BACKGROUND、AYSNC)

@Subscribe(threadMode = ThreadMode.MAIN)

public void eventBusMessage(MyMessage myMessage){

        text.setText(myMessage.getMessage());

}

SendMessageActivity发送消息

MyMessage myMessage =new MyMessage();

myMessage.setMessage("EventBus发送的消息");

EventBus.getDefault().post(myMessage);

finish();

二、发送粘性消息

第一步:

添加依赖:implementation 'org.greenrobot:eventbus:3.1.1'

第二步:

构造发送消息类

第三步:

发布消息

第四步:

接收消息

第五步:

注册监听: EventBus.getDefault().register(this);

解注册监听:EventBus.getDefault().unregister(this);

对应的代码:EventStickyActivity跳转到MessageActivity页面, EventStickyActivity往MessageActivity页面发送消息

EventStickyActivity页面:

跳转时发送消息

MyMessage myMessage =new MyMessage();

myMessage.setMessage("我是粘性事件");

EventBus.getDefault().postSticky(myMessage);

startActivity(new Intent(EventStickyActivity.this, SendMessageActivity.class));

MessageActivity页面:

@Subscribe(threadMode = ThreadMode.MAIN,sticky =true)

public void eventStickyMessage(MyMessage myMessage){

        text.setText(myMessage.getMessage());

}

点击按钮,进行注册:

//为防止多次注册,需要添加变量进行控制

private boolean isFrist =true;

if (isFrist) {

isFrist =false;

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

}

//反注册

@Override

protected void onDestroy() {

    EventBus.getDefault().removeAllStickyEvents();

    EventBus.getDefault().unregister(this);

    super.onDestroy();

}

上一篇下一篇

猜你喜欢

热点阅读