最近的項目有這樣的一個需求氓鄙,在登錄之后有著多個請求璧坟,請求后可能有強制更新的dialog,公告展示的dialog讶隐,賬號安全提醒的dialog等等起胰。有些dialog可能顯示可能不顯示,具體由后臺安排巫延。最初的想法是很無腦效五,在請求的回調里處理下一步流程,需要顯示dialog就顯示dialog炉峰,然后在setOnDismissListener畏妖,在dialog消失后再走下一個流程來顯示其他dialog。在層層回調之后疼阔,一看代碼就不想看個第二遍瓜客,太凌亂了,代碼可沒有什么凌亂美可講竿开,so,做一個優(yōu)雅碼農谱仪。
首先整個問題是一個異步執(zhí)行轉同步,但這樣效率過慢否彩。我的想法是并發(fā)執(zhí)行所以請求疯攒,再統一管理dialog順序顯示。
所以創(chuàng)建一個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按照優(yōu)先級來順序展示敬尺,重寫父類MrBaseDialog的setLevel來設置優(yōu)先級枚尼。
mrBaseDialogs來存儲所有添加過來的dialog,skipLevel 儲存不顯示的dialog級別砂吞。showDialog是核心部分署恍,從優(yōu)先級為1開始展示,如果優(yōu)先級為1的dialog不需要顯示蜻直,則level++盯质,遞歸調用showDialog,輪到優(yōu)先級為2的顯示概而。優(yōu)先級為1的需要顯示則setOnDismissListener呼巷,在它消失的時候level++,遞歸調用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,這里我設置了三個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源譬,所以是紅到綠