延迟队列DelayQueue

17 篇文章 0 订阅

项目中需要统计卸载app,但是安卓系统在用户更新app时,发送的广播是先Intent.ACTION_PACKAGE_REMOVED然后再Intent.ACTION_PACKAGE_ADDED,虽然有参数指定了这个广播是否是更新,然饿还是有不少用户反应他们是重新装了一遍应用,没有卸载却有卸载记录。

boolean replacing = false;
        if(extras!=null){
            replacing = extras.getBoolean(Intent.EXTRA_REPLACING);
        }
可能部分机型是有诡异的不同之处在,所以想着优化下这个判定卸载逻辑。更新app情况下是 ACTION_PACKAGE_REMOVED后紧跟着ACTION_PACKAGE_ADDED广播,所以在收到ACTION_PACKAGE_REMOVED后延迟一段时间,如果这段时间内收到ACTION_PACKAGE_ADDED广播了,则不认为这是个卸载行为。这个就使用延迟队列实现。


DelayQueue是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走。这种队列是有序的,即队头对象的延迟到期时间最长。


DelayQueue里的对象需要实现Delayed接口,getDelay方法返回决定这个任务是否到期,小于等于0就是到期。

@Override
        public long getDelay(@NonNull TimeUnit unit) {
            return unit.convert(delayTime-System.currentTimeMillis(),TimeUnit.MILLISECONDS);
        }
compareTo决定在队列中的排序,

@Override
        public int compareTo(@NonNull Delayed o) {
            return (int) (getDelay(TimeUnit.MILLISECONDS) - o.getDelay(TimeUnit.MILLISECONDS));
        }


评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值