在开发过程中,弹窗是APP重要组成部分!可能会遇到有很多弹窗,如果一下都全部都弹出来,用户体验很不好!这个时候就需要管理弹窗优先级了,让弹窗按照设定好的优先级有序的弹出来。

        首先创建任务抽象基类BaseSyncTask,如下:

      

public abstract class BaseSyncTask implements SyncTask{

    private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }


    @Override
    public boolean equals(Object obj) {//用来去重
        //自反性
        if (this == obj) return true;
        //任何对象不等于null,比较是否为同一类型
        if (!(obj instanceof BaseSyncTask)) return false;
        //强制类型转换
        BaseSyncTask baseSyncTask = (BaseSyncTask) obj;
        //比较属性值
        return getId() == baseSyncTask.getId();
    }
}

此类实现自定义的接口SyncTask,此接口定义了一个方法doTask,如下

public interface SyncTask {
    void doTask();

}

下面是使用方法:

  封装两个方法,一个是加入队列,一个是执行队列

  

//对话框任务队列
private val pendingQueue: java.util.ArrayDeque<BaseSyncTask> = ArrayDeque()
private var mCurrentTask: BaseSyncTask? = null
/**
 * 进入对话框任务队列
 *
 * @param task
 * @param taskId
 * @param isToFirst
 */
fun enqueue(task: BaseSyncTask, taskId: String?, isToFirst: Boolean, canRepeat: Boolean) {
    task.id = taskId
    JKXLog.d("OneByOne:The task id = :" + task.id)
    JKXLog.d("activityCoverOneByeOne", "The task id = :" + task.id)
    if (!canRepeat) {
        pendingQueue.remove(task) //通过是否可重复,去重,防止有误操作造成两个相同的对话框
    }
    if (isToFirst) {
        pendingQueue.offerFirst(task) //the ArrayDeque should not be blocked when operate offer
    } else {
        pendingQueue.offer(task) //the ArrayDeque should not be blocked when operate offer
    }
    JKXLog.d("OneByOne:The pendingQueue", "size = :" + pendingQueue.size)
    JKXLog.d("activityCoverOneByeOne", "The pendingQueue size = :" + pendingQueue.size)
    if ( mCurrentTask == null) { //任务执行时,mBeActivityAppPoped为false时,依赖于活动APP首页弹窗接口的完成
        JKXLog.d("activityCoverOneByeOne", "此时没有红包雨,单独执行任务")
        coreExecute()
    }
}

/**
 * 执行对话框任务队列
 */
private fun coreExecute() {
    if (PageUtil.isLive(this)) {
        mCurrentTask = pendingQueue.poll()
        if (mCurrentTask != null) {
            JKXLog.e("OneByOne:executing currentTask", "id = :" + mCurrentTask!!.id)
            JKXLog.d("activityCoverOneByeOne", "executing currentTask id = :" + mCurrentTask!!.id)
            JKXLog.d("activityCoverOneByeOne", "----------------------end----------------------")
            mCurrentTask!!.doTask()
        }
    }
}

最后在需要管理弹窗的位置调用enque方法加入队列,如下:

//弹出个人信息授权说明弹窗
enqueue(object : BaseSyncTask() {
    override fun doTask() {
        showPersonPriDialog()
    }
}, HomeAppPopConstant.DIALOG_PER_PRI_KEY, true, false)

注意:在弹窗关闭的时候,需要执行 mCurrentTask=null  和coreExecute()方法,以便执行下个弹窗逻辑

HomeAppPopConstant代码如下:

public class HomeAppPopConstant {
    public final static String DIALOG_PER_PRI_KEY = "1";//个人信息授权政策
    public final static String DIALOG_ORDER_KEY = "2";//待支付弹窗
    public final static String DIALOG_MINIPROGRAM_KEY = "3";//小程序弹窗
}

字符串数字从1-3,优先级降低

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐