安卓中弹窗优先级管理方案

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

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

      

public abstract class BaseSyncTask implements SyncTask{private String id;public String getId() {return id;}public void setId(String id) {this.id = id;}@Overridepublic 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 = ArrayDeque()
private var mCurrentTask: BaseSyncTask? = null
/*** 进入对话框任务队列** @param task* @param taskId* @param isToFirst*/
fun enqueue(task: BaseSyncTask, taskId: String?, isToFirst: Boolean, canRepeat: Boolean) {task.id = taskIdJKXLog.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,优先级降低


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部