1. 程式人生 > >開發中Dialog多彈窗管理

開發中Dialog多彈窗管理

隨著專案的不斷迭代,加上產品經理大法(這裡加一個彈窗提示,這裡加一個引導….)各種彈窗在應用啟動時候需要展示, 然而它們出現的時機還有可能重疊。我勒個擦。。。有沒有一種優(tou)雅(lan)的方式來完成這部分的需求呢?沒錯,這就是我們今天要介紹的東西.

我們想的是需要一個佇列來管理彈窗,在各種請求回來之後去往佇列中新增我們需要顯示的彈窗,第一個彈窗消失了之後在顯示下一個彈窗,往復下去直到任務完成。

為了演示這個Demo, 我搬出了珍藏多年的Dialog封裝。。。裡面包含了一些常用Dialog的封裝。具體可以看Demo程式碼。
現在開始正式邏輯功能的實現,我們建立一個DialogManager的單例用於管理彈窗的各種顯示。在此之上我們需要定義一個佇列管理彈窗顯示:

Queue queue = new ConcurrentLinkedQueue<>(); //彈窗佇列(執行緒安全)

為了防止多個執行緒同時操作DialogManager中的queue物件,所以我們採用執行緒安全的ConcurrentLinkedQueue,
這裡簡單的介紹下ConcurrentLinkedQueue實現和資料結構:由head節點和tair節點組成,每個節點(Node)由節點元素(item)和指向下一個節點的引用(next)組成,節點與節點之間就是通過這個next關聯起來,從而組成一張連結串列結構的佇列。預設情況下head節點儲存的元素為空,tair節點等於head節點。

為了儘可能簡單的呼叫,我們只用提供一個push到佇列的方法即可:

  /**
     * 每次彈窗呼叫PushQueue方法
     *
     * @param dialogBase
     */
    public void pushToQueue(BuildBean dialogBase) {
        //新增到佇列中
        if (dialogBase != null) {
            dialogBase.setDissMissListener(() -> {
                        Log.e(TAG, "nextTask"
); nextTask(); } ); Log.e(TAG, "add.."); queue.add(dialogBase); //只有當前佇列數量為1時才能進行下一步操作 if (canShow()) { startNextIf(); } } }

startNextIf 中進行佇列任務的執行操作,如果佇列不為空則進行顯示。

 private void startNextIf() {
        if (queue != null && queue.isEmpty()) {
            return;
        }
        //Todo 可在此處對彈窗進行排序
        oderDialog();
        mDialogBase = queue.element();
        if (mDialogBase != null) {
            mDialogBase.show();
        } else {
            Log.e(TAG, "任務佇列為空...");
        }
    }

需要注意的是我們在顯示之前可以對顯示的彈窗優先級別進行擴充套件,可將優先級別高的彈窗顯示在最前面,BuildBean已有相關擴充套件,可自行設定擴充套件。