Android通用业务弹窗管理方案V3- 业务流程控制

10,188 阅读6分钟

前言

自从发布PoupoLayer以来期间完善了一版之后,已经有一个月没有更新了,期间在写着业务代码的同时涌出许多想法,每个想法如果衍生出框架,都可以极大的降低日常的工作成本并且帮助理清业务的流程,想法越多要做的事情也越来越多,

在不同的框架实现中不断游走, 作为程序员,每天除了工作还得保证两个小时的学习时间 其间个人工作也到达了项目冲刺区基本上周六周日也是开干的节奏 ,剩下没有多少时间来为框架添砖加瓦,实在是有点疏忽了,也深深觉得维护一个框架或者从头编写一个框架的不易,实在感谢那么多的大佬为开源做的贡献,一起共勉

进入正题 第三版的灵感来自于项目中早就发现的一个现象 也感谢之前文章评论留言的同学提出的这个问题

现在回想这个需求 对于之前的回复其实是有些牵强的

因为我们没有办法预测多个网络请求结束的公共时间节点(除非定义一个固定的时间点),这个问题在之后也想了一些时间,考虑到需要统筹各个项目的网络框架就不了了之

但现在想来 我们只需要将这个过程理清,统筹逻辑并不一定要适配某某网络框架,给用户提供调度的接口即可再在其上添加主流网络框架的支持 也不失一种解决办法

在发布V3之前,在我眼里的定义是弹窗的统一管理 包括优先级 显示时间范围 显示倒计时 显示次数等等 但在V3之后它不仅是可以统筹弹窗内部属性的框架 它也是可以统筹外部网络通信的业务逻辑 也可以自定义适合自身业务的弹窗显示逻辑的流程控制框架

实现思路

Android业务中的网络请求方式各种各样 但结果是不变的

可以总结为:成功或失败(需要显示弹窗或者不需要)

所以我们需要定义一个任务类型粒度的对象 它具备基础的优先级属性 根据优先级来控制流程

我们的每一次网络请求可以看成一个Task,它对应着其结果需要显示的弹窗Popi

有了Task当然需要一个管理者去管理业务中繁琐的步骤, TaskManager因此而生其内置了支持保证了在业务流程中 也能使用我们实现的效果 (它包括Dialog,透明Webview等)

由于Task规定了流程的先后顺序 所以在低优先级任务执行成功后显示的弹窗 需要进行预留所以我们需要一个预留弹窗队列保证弹窗显示不会乱序ReServePriorityQueue

最后为了支持主流的回调框架Rxjava在时间和空间上的统筹 增加了其上包含通用逻辑的PopRxSubscriber 用户可以继承进行自定义扩展

流程模拟

上图是以APP开发中最常见的版本更新和公告弹窗的数据交互与显示流程为例的逻辑图

它分为两个部分 分别是引入流程控制前后的逻辑顺序我们可以清晰的发现两者的区别

通常流程下我们必须在每个流程的中介点进行数据产出和UI生成的操作 在框架的帮助下 我们只需要考虑产生UI 具体的逻辑由事先订好的规则由任务管理器帮我们处理

具体使用

基础使用

//创建网络请求任务
Task taskUpdate=new Task();
//新建Poplayer弹窗
PopLayerView mLayerView1 = new PopLayerView(this,LayerConfig.dialog5);
Popi downloadPop = new Popi.Builder()
                .setmPopId(30)
                .setmPriority(6)
                .setmCancelType(TRIGGER_CANCEL)
                .setLayerView(mLayerView1)
                .build();
//加入任务管理                
TaskManager.getInstance(this).pushToQueue(taskUpdate,mUpgradePopi)               

自定义回调

TaskManager.getInstance(this).onTaskGoOn(taskNotice);//回调成功
TaskManager.getInstance(this).onTaskInterupt(taskUpdate);//回调失败

如果您使用的是Rxjava实现回调可以继承框架中自带回调逻辑的PopRxSubscriber

public class MySubscriber extends PopRxSubscriber {
    public MySubscriber(Context mContext, Task task) {
        super(mContext, task);
    }
}

优缺点分析

优点:就代码而言 能解决一个接口有多处调用点的问题 弹窗逻辑上的显示由优先级判断,并且解决了网络逻辑业务无法使用弹窗效果的问题

缺点: 摒弃了某些接口的懒加载特性

心得

发布v3之前我也很怀疑 这个问题是否有解决办法 是否需要花费太多的时间 所以一直犹豫要不要在有限的时间来做这个东西,但其实只要将复杂问题分解下 逐个击破其实并没有想象的那么难缠

第一步 将其中涉及的关键成员都整理起来 阐明对应的职责 用代码实现出一个大概

第二步 将复杂的问题 最小化具象化 将逻辑写下来 根据逻辑和成员类写测试代码

第三步 考虑N+1种可能 将简单问题进行N种可能的适用化 并逐步用在小范围的业务代码上

关于项目

PoupoLayer

Android通用弹窗管理框架,支持网络回调业务逻辑弹窗,内部维护弹窗优先级队列 具备弹窗管理扩展功能 整合Dialog,PoupoWindow,悬浮Widget,透明Webview,Toast,SnackBar,无需再为繁琐的业务弹窗逻辑所困扰

具体如何使用 可以去github.com/MrCodeSnipe…阅读下面的使用说明文档

您也可以下载Demo体验一番 如有问题 可以在Github上打开Issue 我会第一时间回复

如果你对往期版本感兴趣 欢迎前往 观看 别忘了点个赞哟!

Android通用业务弹窗管理方案V1

Android通用业务弹窗管理方案V2

V1方案

版本号 LOG 进度更新
V1.0.0 项目开源,完成弹窗管理与Dialog形式扩展 Dialog策略扩展完成
V1.0.1 修复Dialog策略无法获取dialog实体bug Dialog策略优化
V1.0.2 修复activity摧毁造成的弹窗异常 bug Dialog策略优化
V1.0.3 优化了弹窗的使用更加方便快捷 框架使用优化

V2方案

版本号 LOG 进度更新
V2.0.0 正式加入透明Webview弹窗策略扩展 透明Webview策略扩展完成

V3方案

版本号 LOG 进度更新
V3.0.0 引入流程任务管理模块 解决涉及网络的业务逻辑弹窗

关于我

Hello 我叫lalala,如果您喜欢我的文章,可以去我的Github给个Star我就很开心啦!!!

Github:github.com/MrCodeSnipe…

--End