最近的項目有這樣的一個需求,在登錄之后有著多個請求,請求后可能有強(qiáng)制更新的dialog,公告展示的dialog,賬號安全提醒的dialog等等。有些dialog可能顯示可能不顯示,具體由后臺安排。最初的想法是很無腦,在請求的回調(diào)里處理下一步流程,需要顯示dialog就顯示dialog,然后在setOnDismissListener,在dialog消失后再走下一個流程來顯示其他dialog。在層層回調(diào)之后,一看代碼就不想看個第二遍,太凌亂了,代碼可沒有什么凌亂美可講,so,做一個優(yōu)雅碼農(nóng)。
首先整個問題是一個異步執(zhí)行轉(zhuǎn)同步,但這樣效率過慢。我的想法是并發(fā)執(zhí)行所以請求,再統(tǒng)一管理dialog順序顯示。
所以創(chuàng)建一個OrderDialogManager來進(jìn)行管理。
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按照優(yōu)先級來順序展示,重寫父類MrBaseDialog的setLevel來設(shè)置優(yōu)先級。
mrBaseDialogs來存儲所有添加過來的dialog,skipLevel 儲存不顯示的dialog級別。showDialog是核心部分,從優(yōu)先級為1開始展示,如果優(yōu)先級為1的dialog不需要顯示,則level++,遞歸調(diào)用showDialog,輪到優(yōu)先級為2的顯示。優(yōu)先級為1的需要顯示則setOnDismissListener,在它消失的時候level++,遞歸調(diào)用showDialog,展示優(yōu)先級為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);
}
});
按照優(yōu)先級顯示三個dialog,這里我設(shè)置了三個dialog背景分別是紅,藍(lán),綠色。

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,所以是紅到綠