在开发过程中,弹窗是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,优先级降低