1. 程式人生 > >延遲佇列DelayQueue

延遲佇列DelayQueue

專案中需要統計解除安裝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));
        }