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

前言

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

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

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

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

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

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

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

实现思路

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

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

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

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

有了Task当然需要一个管理者去管理业务中繁琐的步骤, TaskManager因此而生其内置了Poplayer的支持保证了在业务流程中 也能使用我们的Poplayer实现的效果 (它包括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);
    }
}
复制代码

优缺点分析

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

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

心得

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

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

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

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

关于项目

POPLAYER

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

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

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

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

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

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

V1方案
版本号LOG进度更新
V1.0.0项目开源,完成弹窗管理与Dialog形式扩展Dialog策略扩展完成
V1.0.1修复Dialog策略无法获取dialog实体bugDialog策略优化
V1.0.2修复activity摧毁造成的弹窗异常 bugDialog策略优化
V1.0.3优化了弹窗的使用更加方便快捷框架使用优化
V2方案
版本号LOG进度更新
V2.0.0正式加入透明Webview弹窗策略扩展透明Webview策略扩展完成
V3方案
版本号LOG进度更新
V3.0.0引入流程任务管理模块解决涉及网络的业务逻辑弹窗

关于我

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

Github:github.com/MrCodeSnipe…

--End

转载于:https://juejin.im/post/5c961f585188252da05f4b08

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一个通用Android管理框架,内部维护优先级队列 具备管理扩展功能 整合Dialog,PoupoWindow,悬浮Widget,透明Webview,Toast,SnackBar,无需再为繁琐的业务逻辑所困扰如何添加依赖只需要两行代码轻松接入//add this to your repositories  maven { url 'https://www.jitpack.io' } //add this to your dependencies implementation 'com.github.MrCodeSniper:PopLayer:2.0.0'具体如何使用1.根据策略创建对应的view//Dialog形式 PopLayerView  mLayerView = new PopLayerView(this,R.layout.common_dialog_upgrade_app); //透明Webview形式 PopLayerView mLayerView = new PopLayerView(this,LayerConfig.redPocketScheme);2.开始装配配置Popi mUpgradePopi1 = new Popi.Builder()                 .setmPopId(4)//的唯一标识 当id发生改变 视为新的                 .setmPriority(2)//优先级这里不具体划分对应的范围 值越小优先级越高                 .setmCancelType(TRIGGER_CANCEL)//消失的类型分为 TRIGGER_CANCEL(触摸消失) COUNTDOWN_CANCEL (延时消失)                 .setMaxShowTimeLength(5)//最长显示时间(S)                 .setMaxShowCount(5)//最大显示次数                 .setmBeginDate(1548858028)//开始时间 2019-01-30 22:20:28                 .setmEndDate(1548944428)//结束时间 2019-01-31 22:20:28                 .setLayerView(mLayerView)//View                 .build();3.纳入管理//纳入管理 PopManager.getInstance().pushToQueue(mUpgradePopi); //开始显示 PopManager.getInstance().showNextPopi();效果预览未来的计划逐步统一 其他类型的 希望能提供给大家一个较为全面的应对业务需求的管理框架版本记录V1方案版本号LOG进度更新V1.0.0项目开源,完成管理与Dialog形式扩展Dialog策略扩展完成V1.0.1修复Dialog策略无法获取dialog实体bugDialog策略优化V1.0.2修复activity摧毁造成的异常 bugDialog策略优化V1.0.3优化了的使用更加方便快捷框架使用优化V2方案版本号LOG进度更新V2.0.0正式加入透明Webview策略扩展透明Webview策略扩展完成作者介绍Hello 我叫lalala,如果您喜欢这个项目 请给个star 能follow我那真是太好了!!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值