并发任务之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 skipLevel = new ArrayList<>();
    private ArrayList 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

你可能感兴趣的:(并发任务之dialog顺序展示)