并发任务之dialog顺序展示

最近的项目有这样的一个需求,在登录之后有着多个请求,请求后可能有强制更新的dialog,公告展示的dialog,账号安全提醒的dialog等等。有些dialog可能显示可能不显示,具体由后台安排。最初的想法是很无脑,在请求的回调里处理下一步流程,需要显示dialog就显示dialog,然后在setOnDismissListener,在dialog消失后再走下一个流程来显示其他dialog。在层层回调之后,一看代码就不想看个第二遍,太凌乱了,代码可没有什么凌乱美可讲,so,做一个优雅码农。
首先整个问题是一个异步执行转同步,但这样效率过慢。我的想法是并发执行所以请求,再统一管理dialog顺序显示。
所以创建一个OrderDialogManager来进行管理。

public class OrderDialogManager {
    private static OrderDialogManager instance;
    private int level = 1;
    private ArrayList<Integer> skipLevel = new ArrayList<>();
    private ArrayList<MrBaseDialog> mrBaseDialogs = new ArrayList<>();

    private OrderDialogManager() {
    }

    public static OrderDialogManager getInstance() {
        if(instance == null){
        synchronized (OrderDialogManager.class) {
            if (instance == null) {
                instance = new OrderDialogManager();
            }
        }
    }
        return instance;
    }

    public void addDialog(MrBaseDialog dialog) {
        mrBaseDialogs.add(dialog);
        showDialog();
    }

    private void showDialog() {
        if (mrBaseDialogs.size() > 0) {
            if (!skipLevel.contains(level)){
                for (final MrBaseDialog mrBaseDialog : mrBaseDialogs) {
                    if (mrBaseDialog.getLevel()== level) {
                        mrBaseDialog.show();
                        mrBaseDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
                            @Override
                            public void onDismiss(DialogInterface dialogInterface) {
                                level++;
                                mrBaseDialogs.remove(mrBaseDialog);
                                showDialog();
                            }
                        });
                        break;
                    }
                }
            }else {
                level++;
                showDialog();
            }

        }


    }

    public void skipDialog(int level) {
        skipLevel.add(level);
        showDialog();
    }
}

dialog按照优先级来顺序展示,重写父类MrBaseDialog的setLevel来设置优先级。
mrBaseDialogs来存储所有添加过来的dialog,skipLevel 储存不显示的dialog级别。showDialog是核心部分,从优先级为1开始展示,如果优先级为1的dialog不需要显示,则level++,递归调用showDialog,轮到优先级为2的显示。优先级为1的需要显示则setOnDismissListener,在它消失的时候level++,递归调用showDialog,展示优先级为2的dialog。
以下是个简单示范:

Button button=findViewById(R.id.show_dialog);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                FirstDialog firstDialog=new FirstDialog(MainActivity.this);
                SecondDialog secondDialog=new SecondDialog(MainActivity.this);
                ThirdDialog thirdDialog=new ThirdDialog(MainActivity.this);

                firstDialog.setLevel(1);
                secondDialog.setLevel(2);
                thirdDialog.setLevel(3);
                OrderDialogManager.getInstance().addDialog(firstDialog);
                OrderDialogManager.getInstance().addDialog(secondDialog);
                OrderDialogManager.getInstance().addDialog(thirdDialog);
            }
        });

按照优先级显示三个dialog,这里我设置了三个dialog背景分别是红,蓝,绿色。


1.gif
Button button=findViewById(R.id.show_dialog);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                FirstDialog firstDialog=new FirstDialog(MainActivity.this);
                SecondDialog secondDialog=new SecondDialog(MainActivity.this);
                ThirdDialog thirdDialog=new ThirdDialog(MainActivity.this);

                firstDialog.setLevel(1);
                secondDialog.setLevel(2);
                thirdDialog.setLevel(3);
                OrderDialogManager.getInstance().addDialog(firstDialog);
                OrderDialogManager.getInstance().skipDialog(secondDialog.getLevel());
                OrderDialogManager.getInstance().addDialog(thirdDialog);
            }
        });

跳过第二个dialog,所以是红到绿
2.gif
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,925评论 25 709
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 13,079评论 2 59
  • 教室 是老师向学生传授课业的场所,也是学生在学校学习的主要场所。良好的教室环境对学生良好学习习惯的养成和优秀品德的...
    明月8889阅读 175评论 0 0
  • 我对现状基本满意,也在寻求改变,但不是换行。我喜欢当老师,喜欢老师的行程,喜欢老师的时间,喜欢老师与学生的接近。我...
    玲珑小巫阅读 266评论 0 0