开发中Dialog多弹窗管理
随着项目的不断迭代,加上产品经理大法(这里加一个弹窗提示,这里加一个引导….)各种弹窗在应用启动时候需要展示, 然而它们出现的时机还有可能重叠。我勒个擦。。。有没有一种优(tou)雅(lan)的方式来完成这部分的需求呢?没错,这就是我们今天要介绍的东西.
我们想的是需要一个队列来管理弹窗,在各种请求回来之后去往队列中添加我们需要显示的弹窗,第一个弹窗消失了之后在显示下一个弹窗,往复下去直到任务完成。
为了演示这个Demo, 我搬出了珍藏多年的Dialog封装。。。里面包含了一些常用Dialog的封装。具体可以看Demo代码。
现在开始正式逻辑功能的实现,我们创建一个DialogManager的单例用于管理弹窗的各种显示。在此之上我们需要定义一个队列管理弹窗显示:
Queue queue = new ConcurrentLinkedQueue<>(); //弹窗队列(线程安全)
为了防止多个线程同时操作DialogManager中的queue对象,所以我们采用线程安全的ConcurrentLinkedQueue,
这里简单的介绍下ConcurrentLinkedQueue实现和数据结构:由head节点和tair节点组成,每个节点(Node)由节点元素(item)和指向下一个节点的引用(next)组成,节点与节点之间就是通过这个next关联起来,从而组成一张链表结构的队列。默认情况下head节点存储的元素为空,tair节点等于head节点。
为了尽可能简单的调用,我们只用提供一个push到队列的方法即可:
/**
* 每次弹窗调用PushQueue方法
*
* @param dialogBase
*/
public void pushToQueue(BuildBean dialogBase) {
//添加到队列中
if (dialogBase != null) {
dialogBase.setDissMissListener(() -> {
Log.e(TAG, "nextTask");
nextTask();
}
);
Log.e(TAG, "add..");
queue.add(dialogBase);
//只有当前队列数量为1时才能进行下一步操作
if (canShow()) {
startNextIf();
}
}
}
startNextIf 中进行队列任务的执行操作,如果队列不为空则进行显示。
private void startNextIf() {
if (queue != null && queue.isEmpty()) {
return;
}
//Todo 可在此处对弹窗进行排序
oderDialog();
mDialogBase = queue.element();
if (mDialogBase != null) {
mDialogBase.show();
} else {
Log.e(TAG, "任务队列为空...");
}
}
需要注意的是我们在显示之前可以对显示的弹窗优先级别进行扩展,可将优先级别高的弹窗显示在最前面,BuildBean已有相关扩展,可自行设置扩展。
开发中Dialog多弹窗管理的更多相关文章
- iOS开发中使用CocoaPods来管理第三方的依赖程序
之前也碰到类似的问题,怎样去管理这些第三方的文件,虽然手动添加也不算麻烦. 写这篇文章主要参考了唐巧的博文,链接如下: http://blog.devtang.com/blog/2012/12/02/ ...
- Java开发中Maven Jar包管理建议
Jar包管理规范 基于使用Git做版本控制,使用Jenkins做持续集成,以及Git-flow分支管理策略的情况: 带-SNAPSHOT为快照版本,例如1.0.0-SNAPSHOT 正式发布版本只有版 ...
- Android开发中常用Dialog(普通弹窗&时间选择器&日历选择器)
引言 开发中,我们会有很多地方使用 Dialog 来展示一些提示信息或设置信息.如:用户提示.进度展示.时间设置.日期设置等. 下面我和大家一些学习下Android中常用的几种Dialog吧~ * 首 ...
- ios 开发中使用SVN管理代码
今天新公司需要使用SVN管理代码,就在网上查看相关的资料,现在把相关用法记录下来: 1.使用的是这个软件Cornerston 网上有很多相应的下载链接,可以去查看 2.下载安装之后,首先需要添加仓库r ...
- [转载]对iOS开发中内存管理的一点总结与理解
对iOS开发中内存管理的一点总结与理解 做iOS开发也已经有两年的时间,觉得有必要沉下心去整理一些东西了,特别是一些基础的东西,虽然现在有ARC这种东西,但是我一直也没有去用过,个人觉得对内存操作 ...
- Atitit. 软件开发中的管理哲学--一个伟大的事业必然是过程导向为主 过程导向 vs 结果导向
Atitit. 软件开发中的管理哲学--一个伟大的事业必然是过程导向为主 过程导向 vs 结果导向 1. 一个伟大的事业必然是过程导向为主 1 1.1. 过程的执行情况(有明确的执行手册及标准) ...
- iOS开发中的内存管理
一.为什么要进行内存管理 系统资源有限,iOS会为每一个执行的程序分配30M的内存,超过20M会收到内存警告,超过30M将会终止应用程序.因此,要及时回收一些不须要再继续使用的内存空间,比方回收一些不 ...
- WinForm开发中通用附件管理控件设计开发参考
1.引言 在WinForm开发中,文件附件的管理几乎在任何一个应用上都会存在,是一个非常通用集中的公共模块.我们日常记录会伴随着有图片.文档等附件形式来展现,如果为每个业务对象都做一个附件管理,或者每 ...
- iphone开发中使用nib(xib)文件的内存管理
iphoneuinavigationcontrollercocoauiviewvariableswindows 在使用nib文件做界面开发的过程中,加载nib文件后,由于设置了outlet和deleg ...
随机推荐
- php 正则表达式一.函数解析
php正则表达式官方手册参考....... 一.php中 常用的正则表达式函数 1.preg_match与preg_match_all preg_match: 函数信息 preg_match_all: ...
- 接口测试工具 — jmeter(关联)
1.正则表达式 1)添加正则表达式提取器 2)提取关联词 3)填写正则表达式 4)使用关联,其他请求使用${sign2}代替变量值 2. 1)添加提取器 2)填写变量值 3)使用关联,其他请求使用${ ...
- javaweb项目中嵌入webservice--axis2
由于最近项目中需要搭建webservice服务端,由于原项目是javaweb项目,所以需要整合.之前用cxf试了,启动老是报错,maven依赖冲突.后来索性换成axis2 百度了一圈,下面这个博客 h ...
- 解决ajax无法给js全局变量赋值的问题
解决ajax无法给js全局变量赋值的问题 http://blog.csdn.net/qq_26222859/article/details/51543433 在ajax中是无法给js中的全局变量赋值的 ...
- js实现模糊查询
1.简述 实现模糊查询方法有很多种,后端可以实现,前端使用js也可以实现. 后端实现起来需要根据输入框中搜索的关键字,去后台拼接SQL语句查询. 前端直接使用字符串的indexOf()方法或者正则表达 ...
- 我的Android进阶之旅------>Android颜色值(#AARRGGBB)透明度百分比和十六进制对应关系以及计算方法
我的Android进阶之旅-->Android颜色值(RGB)所支持的四种常见形式 透明度百分比和十六进制对应关系表格 透明度 十六进制 100% FF 99% FC 98% FA 97% F7 ...
- rtsp over udp
#include <stdio.h> #include <netinet/in.h> #include <sys/socket.h> #include <st ...
- PAT 1085 Perfect Sequence[难]
1085 Perfect Sequence (25 分) Given a sequence of positive integers and another positive integer p. T ...
- Hbase 学习笔记5----hbase region, store, storefile和列簇的关系
The HRegionServer opens the region and creates a corresponding HRegion object. When the HRegion is o ...
- PageObjects 设计模式
什么是Page Objects(翻译为:页面对象?)… 简单的说,Page Objects是指UI界面上用于与用户进行交互的对象.它可以指整个页面,也可以指Page上的某个区域.Page Object ...