并發(fā)任務(wù)之dialog順序展示

最近的項目有這樣的一個需求,在登錄之后有著多個請求,請求后可能有強(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),綠色。


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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,769評論 25 709
  • 用兩張圖告訴你,為什么你的 App 會卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 13,913評論 2 59
  • 教室 是老師向?qū)W生傳授課業(yè)的場所,也是學(xué)生在學(xué)校學(xué)習(xí)的主要場所。良好的教室環(huán)境對學(xué)生良好學(xué)習(xí)習(xí)慣的養(yǎng)成和優(yōu)秀品德的...
    明月8889閱讀 246評論 0 0
  • 我對現(xiàn)狀基本滿意,也在尋求改變,但不是換行。我喜歡當(dāng)老師,喜歡老師的行程,喜歡老師的時間,喜歡老師與學(xué)生的接近。我...
    玲瓏小巫閱讀 293評論 0 0

友情鏈接更多精彩內(nèi)容