• 第三方框架:EventBus


    1 研发背景

    案例:我们在主页点收藏按钮,未登录状态,跳登录界面,在登录界面跳注册页面,注册成功,关闭注册页面,关闭登录页面,回到主页,刷新item列表和登录状态。
    我们一般会用到发送广播和接收广播来实现。本地广播是相对消耗时间、空间最多的一种方式,是重量级的,消耗资源较多的一种方式。四大组件之一,许多系统级的事件都是通过广播来通知的。比如网络变化,电量变化,短信发送接收。
    如果与系统相关的通知,还是选择本地广播。在广播的onreceive方法中,可以获得context,intent参数,有丰富的api供我们使用。如果与系统事件不相关的交互,使用广播是一种浪费。由此,我们可以使用EventBus来实现相关需求。

    2 EventBus简介

    EventBus 是一款针对Android优化的发布/订阅事件总线。主要功能是替代intent,handler,broadcast在fragment,activity,service,线程之间的传递消息。
    EventBus作为Android开发常用框架,有许多优点:
    1 调度灵活,不依赖context。
    2 使用简单,代码简洁。
    3 松耦合。有效地降低消息发布者和订阅者之间的耦合度。
    当想通知其他组件某些事情发生时常常使用观察者模式。EventBus是一个观察者模式的实现,有三个要素:
    1 Event 事件:可以是任意类型对象
    2 Subscriber 订阅者,接收特定的事件,以约定的onEvent开头的函数,有4种
    3 Publisher 事件发布者,用于通知Subscriber有事件发生,可以通过post(object)在任意线程任意位置发送事件
    额外一点,订阅者可以订阅多个事件,发送者可以发布任何事件,发布者同时也可以是订阅者。
    EventBus架构图:

    3 EventBus 3.0使用

    project目录build.gradle  添加classpath: classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' 
    module目录build.gradle 添加plugin:apply plugin:'android-apt';添加依赖: compile 'com.greenrobot:eventbus:3.0.0’
     
    (1) 定义事件
         public class AnyEventType{
           }
     
    (2) 在要接收消息的页面注册
        EventBus.getDefault().register(this);
     
    (3) 接收消息(共有四个函数,选择实现下列任一 一个)
    1、onEvent 事件处理和事件发送在相同线程,事件处理时间不应太长,不然影响事件的发送线程。
    2、onEventMainThread 事件的处理在UI线程执行。事件处理时间不能太长,以防出现ANR
    3、onEventBackgroundThread 事件处理在一个后台线程中执行,时间不能太长
    4、onEventAsync 事件处理在单独的线程中执行,主要用于在后台中执行 耗时操作,每个事件会开启一个线程,但最好限制线程的数目。
     
    (4) 发送消息
         EventBus.getDefault().post("resiterSuccess");
    (5) 解除注册
         EventBus.getDefault().unregister(this);
     
    告知观察者事件发生时通过EventBus.post函数实现,这个过程叫做事件的发布,观察者被告知事件发生叫做事件的接收,是通过下面的订阅函数实现的。
    onEvent:如果使用onEvent作为订阅函数,那么该事件在哪个线程发布出来的,onEvent就会在这个线程中运行,也就是说发布事件和接收事件线程在同一个线程。使用这个方法时,在onEvent方法中不能执行耗时操作,如果执行耗时操作容易导致事件分发延迟。
    onEventMainThread:如果使用onEventMainThread作为订阅函数,那么不论事件是在哪个线程中发布出来的,onEventMainThread都会在UI线程中执行,接收事件就会在UI线程中运行,这个在Android中是非常有用的,因为在Android中只能在UI线程中跟新UI,所以在onEvnetMainThread方法中是不能执行耗时操作的。
    onEventBackground:如果使用onEventBackgrond作为订阅函数,那么如果事件是在UI线程中发布出来的,那么onEventBackground就会在子线程中运行,如果事件本来就是子线程中发布出来的,那么onEventBackground函数直接在该子线程中执行。
    onEventAsync:使用这个函数作为订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程在执行onEventAsync.
     
    问题 这4个方法是否会同时触发?选择哪一个触发?
    当发过来一个消息的时候,EventBus怎么知道要调哪个函数呢,就看onEvent函数传进去的参数与发送消息的参数类型是否一致,哪个是就调哪个。那如果有两个是呢,那两个都会被调用!!!!
    识别EventBus中四个函数中触发哪一个,是通过参数中的类名来决定的。
  • 相关阅读:
    幸福婚姻的八个公式
    中国移动增值服务的现状及趋势
    移动通信与互联网融合已成为趋势
    项目管理入门
    4GMF论坛主席卢伟谈4G全球发展概况
    吴刚实践总结手机网游十大金科玉律
    项目管理五大过程组在通信工程中的运用实例
    报告称近半WAP用户低学历 学生工人上网最多
    手机杂志:成长的烦恼
    3G门户网
  • 原文地址:https://www.cnblogs.com/suiyilaile/p/9156062.html
Copyright © 2020-2023  润新知