• EventBus使用说明


    EventBus使用说明

    EventBus因为其使用方便简单,受到了很多Android开发的喜爱。我将从这篇博客开始,学习EventBus。在学习EventBus的原理之前,我先记录一下EventBus的使用方法。

    EventBus类似Android中的广播,是标准的观察者模式。因此,我们在使用EventBus时,只需要关注三件事。制作一个消息,注册一个监听者,发送一个消息。

    1.制作一个消息:

    public class EventBusBaseMsg  {
        public EventBusBaseMsg(String name){
            this.name = name;
        }
        public String name;
    }

    2.注册一个监听者:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mStartActivityBtn = (TextView) findViewById(R.id.start_activity_btn);
        mStartActivityBtn.setOnClickListener(this);
        EventBus.getDefault().register(this);
     
    }
     
    @Subscribe(threadMode = ThreadMode.MAIN , priority = 1)
    public void onMsg1(EventBusBaseMsg event) {
        Log.d("tag", this.getClass().getSimpleName() + " receive the msg1 = " + event);
    }
     
    @Subscribe(threadMode = ThreadMode.MAIN  , priority = 1)
    public void onMsg2(EventBusBaseMsg event) {
        Log.d("tag", this.getClass().getSimpleName() + " receive the msg2 = " + event);
    }
     

    通过Subscribe的注解,我们将某个方法定义为监听者,在Subscribe中,我们可以设置监听者的一些属性,这个在后面记录。

    3.发送消息:

     
     EventBus.getDefault().post(new EventBusBaseMsg("101zg"));

    这三步完成,我们就可以完成一次消息在总线上的传递。

    Subscribe:

    在写监听方法时,我们需要为该方法加上@Subscribe注解。这个注解提供一些可以设置的属性。

     threadMode:

     这个属性选择监听方法,在得到消息后,在哪里来处理这个消息。

     POSTING:事件的处理在和事件的发送在相同的线程,所以事件处理时间不应太长,不然影响事件的发送线程。

     MAIN: 事件的处理会在UI线程中执行。事件处理时间不能太长,长了会出现臭名远之的ANR。

     BACKGROUND:事件的处理会在一个后台线程中执行。虽然名字是BackgroundThread,事件处理是在后台线程,但事件处理时间还是不应该太长,因为如果发送事件的线程是后台线程,会直接在当前后台线程执行事件;如果当前线程是UI线程,事件会被加到一个队列中,由一个线程依次处理这些事件,如果某个事件处理时间太长,会阻塞后面的事件的派发或处理。

     ASYNC:事件处理会在单独的线程中执行,主要用于在后台线程中执行耗时操作,每个事件会开启一个线程,但最好限制线程的数目。

     priority:

     这个属性,用来确定监听的优先级。priority值比较高的监听方法,会先进行处理。如果优先级相同,则先注册的会先接收到消息并进行处理。

     sticky:

     粘性事件,类似于粘性广播。可以先发消息,再注册监听,类似于Android中的粘性广播。Google建议谨慎使用粘性广播。因为它会带来内存泄露。

    陷阱:

    以上的使用方法,可以看到效果,但是留下了一些隐患。

    1.通过EventBus.getDefault().register(this);我们可以看到,EventBus包含一个单例模式,而在注册的时候,这个单例又获得了Activity的引用——this。如果我们不进行正确地注销,不仅Activity不会被释放,它的监听函数也会一起响应。

    因此,我们需要根据自己的需要,在合适的地方进行注销,切断EventBus和监听者的引用的关联。

     EventBus.getDefault().unregister(this);

    2.EventBus的注册监听函数的机制,采用的方法是反射。反射的缺点是:效率低和不能混淆。这也是EventBus的缺点。所以,EventBus只适合小规模的,在组件间进行通信。

    EventBus的基本使用就记录至此,下一篇开始探究它的原理。

    Done~

  • 相关阅读:
    PHP 数据类型
    PHP SAPI
    PHP 基础架构
    PHP7的变化
    mysql 选择优化的数据类型需要注意的几点
    彻底删除在github上提交的文件
    php7 新特性
    php缓冲区 一些笔记
    设计模式 一些概念
    mysql性能优化其中一部分小结
  • 原文地址:https://www.cnblogs.com/fishbone-lsy/p/5397385.html
Copyright © 2020-2023  润新知