美文网首页
android eventbus

android eventbus

作者: 图之 | 来源:发表于2020-11-17 13:50 被阅读0次

    EventBus :针对Android优化的发布/订阅事件总线,简化应用程序内各组件间、组件与后台线程间的通信。
    优点:开销小,代码又简洁优雅,将发送者和接受者解耦。

    eventbus三要素
    1.event:事件,可以是任意类型的对象

    2.Subscriber:事件订阅者,eventbus3.0之前消息处理的方法只限定于onEvent()/onEventMainThread()/onEventBackgroundThread()和onEventAsync()四种线程模型。3.0之后事件处理的方法可以随便取名,但是需要添加注解@Subsceribe,和指定线程模型(默认posting)

    3.publisher:事件发布者,可以在任意线程任意位置发送事件,直接调用eventbus的post(object)方法。可自己实例化eventbus对象,一般使用eventbus。getDefault()就可,根据post函数参数的类型,会自动调用订阅相应类型事件的函数

    eventbus的四种线程模型
    1.posting(默认):若使用事件处理函数指定了线程模型,那么该事件在哪个线程发布出来的,时间梳理函数就会在那个线程中运行。也就是说发布事件和接收事件在同一个线程,在该线程的事件处理函数中尽量避免执行耗时操作,因为它会阻塞时间的传递,甚至可能引起ANR

    2.MAIN:事件的处理会在UI线程中执行,事件处理的时间不能太长,否则会ANR

    3.BACKGROUND:事件的处理会在UI线程中发布出来,那么该事件处理函数就会在新的线程中运行,如果事件本来就是子线程发布出来的,那么该事件处理函数直接在发布事件的线程中执行。此事件处理函数中禁止进行UI更新操作

    4.async:无论事件在哪个线程发布,该事件处理函数都会在新建的子线程中执行,同样的,此事件处理函数禁止进行UI更新操作

    使用流程
    1.自定义一个事件类

    public class UserData {
    private String name;
    private String message;
    
    //getter setter 
    
    }
    

    2.在需要订阅事件的地方注册事件

    EventBus.getDefault().register(this);
    

    3.发送事件

    UserData data = new UserData();
    data.setName("老子王");
    data.setMessage("今天中了一等奖");
    EventBus.getDefault().post(data);
    

    4.处理事件

    /**
      *sticky     如果为true,则发送最近的粘性事件
      *priority  订阅者优先级,影响事件传递的顺序,越大优先级越高
      **/
        @Subscribe(threadMode = ThreadMode.MAIN, sticky = true, priority = 1)
        public void eventBus(UserBean userBean){
               //todo  发送事件传递来的消息,想干啥干啥
        }
    

    5.取消事件订阅

    EventBus.getDefault().unregister(this);
    

    粘性事件

    使用postSticky()发送事件,那么可以不需要先注册,也能接受到事件,也就是一个延迟注册的过程。

    相关文章

      网友评论

          本文标题:android eventbus

          本文链接:https://www.haomeiwen.com/subject/sndvbktx.html