MutilDialogManger

Introduction: android 多弹窗管理摆脱项目中各种弹窗在应用启动时展示叠加问题,可设置优先展示级别高的弹窗
More: Author   ReportBugs   
Tags:

随着项目的不断迭代,加上产品经理大法(这里加一个弹窗提示,这里加一个引导....)各种弹窗在应用启动时候需要展示, 然而它们出现的时机还有可能重叠。我勒个擦。。。有没有一种优(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 已有 相关扩展,可自行设置扩展。

Apps
About Me
Google+: Trinea trinea
GitHub: Trinea