美文网首页
EventLine——业务事件线

EventLine——业务事件线

作者: ZuYuan | 来源:发表于2020-06-06 17:14 被阅读0次

前言

本篇文章主要讲解一个自己的一个三方库——EventLine,业务上的安全的、可感知的事件线。
此库仍未开发完善,请勿直接导入可盈利项目,可导入demo项目或者用于学习使用。

引入

项目地址
导入项目:

    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }
dependencies {
            implementation 'com.github.zhaozuyuan:eventline:1.0.3-release'
    }

概述

主要比对的是EventBus和RxBus。

  • 它类似于RxBus,但是暂未支持RxJava;
  • 它不会跟EventBus有冲突,它所针对的是业务上更加细粒度的事件传递,并非事件总线。
  • 比起EventBus、RxBus,它的单线概念更加强烈,旨在创建一个更加安全的事件传输环境,此点与广播相反;
  • 它支持初始化,可注入日志打印器、日志等级、IO线程池、CPU线程池;
  • 它支持接收方限定接收事件的子类型;

若看完了还有些懵,请直接看演示。

演示

初始化

  • 它支持了自定义IO、CPU线程池,这利于实际项目的开发;
  • 支持了自定义的日志打印器。
        //配置初始化信息
        ConfigParams params = new ConfigParams()
                //能否发现事件的父类
                .setCanFindEventParent(true)
                //cpu 线程
                .setCPUExecutor(null)
                //io 线程
                .setIOExecutor(null)
                //日志打印器
                .setLogger(new ILogger() {
                    @Override
                    public void logDebug(String msg) {
                        System.out.println(msg);
                    }

                    @Override
                    public void logWarn(String msg) {
                        System.out.println(msg);
                    }

                    @Override
                    public void logError(String msg) {
                        System.out.println(msg);
                    }
                })
                .setLogLevel(LogLevel.ERROR);
        //初始化库
        EventLineInitialization.init(params);

发送事件

  • 它在发送事件的时候要求必须传入当前发送者环境,多为当前Class;
  • 它可以限定接收方,指定Class的接收方才能接收事件,不足的是这个功能不支持多态
  • 支持了一个状态池,仅发送粘性事件私有,代表的是发送方的状态;
        //发送事件准备
        //发送者的环境,多为当前类Class
        Class context = getClass();
        //限定接收方
        Class[] targets = new Class[]{ getClass() };
        //事件
        Object event = new Object();
        //自定义状态
        final int normalStatus = 1;
        final int hotStatus = 2;

        //发送事件
        EventSender.sendEvent(context, event);
        //发送事件+限定接收者
        EventSender.sendEvent(context, event, targets);
        //发送粘性事件
        EventSender.sendStickyEvent(context, event);
        //发送粘性事件+状态控制器
        StatusController controller = EventSender
                .sendStickyEventWithController(context, event, normalStatus);
        controller.refreshSenderStatus(hotStatus);

接收事件

  • 支持状态监听策略(类似于拦截器),可根据当前发送者的状态进行拦截或者线程调度;
  • 类似于发送者,接收方也必须指定“接收环境”, 也可以指定接收某些发送方;
  • 支持Lifecycle自动解绑;
  • 支持单点设置是否能够接收事件的子类型对象;
  • 支持一键切换线程,并且默认在当前线程,肯定不会存在多余的切换线程操作;
        //事件接收策略
        IEventStrategy strategy = new IEventStrategy() {
            @Override
            public void scheduleThread1(IScheduler threadScheduler) {
                //普通调度线程策略
                threadScheduler.currentThread();
            }

            @Override
            public boolean withCustomStatus(@Nullable IStatusReader statusReader,
                                            IScheduler threadScheduler) {
                //监控事件状态,可选择拦截事件继续传递
                //true 不拦截, false拦截事件
                return statusReader == null || statusReader.readSenderStatus() != normalStatus;
            }
        };

        //接收事件
        ICancellable cancellable = EventReceiver.generateReceiver(MainActivity.class, Object.class)
                //接收指定发送方的事件
                .setSpecifiedSenders(new Class[]{ getClass() })
                //自动解除
                .setAutoCancelObserver(getLifecycle())
                //能够接收粘性事件
                .canReceiveStickyEvent(true)
                //设置状态监听策略
                .setStatusStrategy(strategy)
                //能够接收监听事件的子类事件
                .canReceiveEventChild(true)
                //调度到主线程
                .scheduleToMainThread()
                //监听事件
                .observer(new IReceiver<Object>() {
                    @Override
                    public void onReceive(Object event) {
                        Log.d("tag", "-->" + event.toString());
                    }
                });
        //主动解绑
        cancellable.cancelObserver();

针对场景

  • 事件发送方存在多状态的场景,使用带StatusController的粘性事件,接收方同样可以感知到发送方当前的状态,做出是否“拦截”的操作;
  • 业务上代码复杂且需要事件传递的场景,使用它可以实现“点对点”的事件传输,代码会更加安全;
  • 有EventBus(事件总线)的情况下,EventLine可以作为事件单线对项目的业务事件传递进行补充;

相关文章

  • EventLine——业务事件线

    前言 本篇文章主要讲解一个自己的一个三方库——EventLine,业务上的安全的、可感知的事件线。此库仍未开发完善...

  • ios组建化方案之CTMediator

    先放Demo,Demo实现 主工程调用 业务线A 业务线B 同时业务A可以调用业务B 主工程地址:https://...

  • 组件化开发实践

    起源 随着产品线和业务的增加,公司的业务的发展需要,现在的一个项目都多个产品线和业务线,每个产品线和业务线有一部分...

  • 矩阵式管理

    矩阵式管理一条线是流程线,负责管理资源、规划和流程;另一条线是业务线,负责管理产品、进度、市场和业务。随着业务线、...

  • 如何创建工作收纳箱

    梳理工作思路: 1、提数(几条业务线) 2、做报表(按照业务线需求) 3、做BI(按照业务线需求和自己对整体需求逻...

  • Android组件化基础篇~

    前言 公司包含三大业务线,每条业务线都有独立的app。功能模块难免会有重合~举个栗子,直播功能本来只在业务线A使用...

  • NC业务规则和业务事件

    在NC二开中,经常要在保证系统核心业务不变的情况下,对系统的业务逻辑进行扩展,这些行为统称为“后端扩展”。对于单据...

  • 58 到家账户账务系统架构与实践

    说到账务系统,先介绍一下 58 到家的三大业务线:速运、家政以及平台业务线。每条业务线都有各自的用户、商家、以及运...

  • Golang领域模型-实体

    前言: 实体具有业务属性、业务逻辑和业务行为,是是实实在在的业务对象。在事件风暴中,我们可以根据命令、操作与事件将...

  • 业务线开发的价值

    业务线开发真的没有成长价值吗? 程序员鄙视链中,做基础平台的鄙视业务线开发,业务线开发的同学也常焦虑自己没有成长。...

网友评论

      本文标题:EventLine——业务事件线

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