EventLine——业务事件线

前言

本篇文章主要讲解一个自己的一个三方库——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可以作为事件单线对项目的业务事件传递进行补充;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。