[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8F2roFZY-1641136071656)(https://user-gold-cdn.xitu.io/2019/3/23/169aa784503258bf?imageView2/0/w/1280/h/960/ignore-error/1)]
现在回想这个需求 对于之前的回复其实是有些牵强的
因为我们没有办法预测多个网络请求结束的公共时间节点(除非定义一个固定的时间点),这个问题在之后也想了一些时间,考虑到需要统筹各个项目的网络框架就不了了之
但现在想来 我们只需要将这个过程理清,统筹逻辑并不一定要适配某某网络框架,给用户提供调度的接口即可再在其上添加主流网络框架的支持 也不失一种解决办法
在发布V3之前,在我眼里的定义是弹窗的统一管理 包括优先级 显示时间范围 显示倒计时 显示次数等等 但在V3之后它不仅是可以统筹弹窗内部属性的框架 它也是可以统筹外部网络通信的业务逻辑 也可以自定义适合自身业务的弹窗显示逻辑的流程控制框架
实现思路
Android业务中的网络请求方式各种各样 但结果是不变的
可以总结为:成功或失败(需要显示弹窗或者不需要)
所以我们需要定义一个任务类型粒度的对象 它具备基础的优先级属性 根据优先级来控制流程
我们的每一次网络请求可以看成一个Task,它对应着其结果需要显示的弹窗Popi
有了Task当然需要一个管理者去管理业务中繁琐的步骤, TaskManager因此而生其内置了支持保证了在业务流程中 也能使用我们实现的效果 (它包括Dialog,透明Webview等)
由于Task规定了流程的先后顺序 所以在低优先级任务执行成功后显示的弹窗 需要进行预留所以我们需要一个预留弹窗队列保证弹窗显示不会乱序ReServePriorityQueue
最后为了支持主流的回调框架Rxjava在时间和空间上的统筹 增加了其上包含通用逻辑的PopRxSubscriber 用户可以继承进行自定义扩展
流程模拟
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AvU70NuU-1641136071657)(https://user-gold-cdn.xitu.io/2019/3/23/169aab28af7807d5?imageView2/0/w/1280/h/960/ignore-error/1)]
上图是以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之前我也很怀疑 这个问题是否有解决办法 是否需要花费太多的时间 所以一直犹豫要不要在有限的时间来做这个东西,但其实只要将复杂问题分解下 逐个击破其实并没有想象的那么难缠 也很怀疑 这个问题是否有解决办法 是否需要花费太多的时间 所以一直犹豫要不要在有限的时间来做这个东西,但其实只要将复杂问题分解下 逐个击破其实并没有想象的那么难缠
|