最近的项目有这样的一个需求,在登录之后有着多个请求,请求后可能有强制更新的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背景分别是红,蓝,绿色。
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,所以是红到绿