ContentObserver onChange,同时仍然在上一次onChange上工作

时间:2017-07-07 20:17:52

标签: android contentobserver

我的应用程序通过远程命令将联系人添加到电话簿。使用一个命令可以添加的联系数量没有限制。

应用程序使用服务中的ContentObserver侦听添加的联系人的更改。处理onChange()可能需要一些时间,因为应用程序需要查找更新的联系人以及受影响的字段。

问题是,当收到命令一次添加许多联系人(例如200)时,ContentObserver会收到重叠的onChange()。也就是说,当它仍然在前一个工作时它会变为onChange()。这种重叠会导致问题。

处理此问题的最佳方法是什么?

理想情况下,我想要的是:如果在处理前一个时发生新的onChange(),则丢弃之前的工作并从新的开始。但是怎么做呢?

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,我解决了这样的问题,例如,如果你有10个联系人更改,第一次联系人更新将获得onChange但是在本地联系时,它将需要大约1秒,所以我们有如果我们获得下一次联系更新,那么在此之前有足够的延迟更新,它将取消之前的计时器并且它将自动启动,因此我们只有在所有联系人更新后才能获得运行方法。

    private Timer waitingTimer;

    private Timer waitingSMSTimer;

    private Timer waitingVoiceMailTimer;

    private void sendDelayAction() {

        if (waitingTimer != null) {
            waitingTimer.cancel();

            /**
             * Timer in Java will throw IllegalStateException if you try to schedule task on a Timer
             * which has been cancelled or whose Task execution Thread has been terminated. so we
             * are making null and create timer every time.
             */
            waitingTimer = null;
        }

        waitingTimer = new Timer();

        final TimerTask timerTask = new TimerTask() {

            @Override
            public void run() {
                // Do your action here.
            }
        };

        waitingTimer.schedule(timerTask, 1500);
    }

    /**
     * Content observer for Address book contacts change notification.
     */
    public class AddressBookContentObserver extends ContentObserver {
        public AddressBookContentObserver() {
            super(null);
        }

        @Override
        public void onChange(boolean selfChange) {
            super.onChange(selfChange);
            // We are waiting for some time, Native contact taking some time ot update, before that
            // if we try to fetch the contact, its not returning the newly added contact
            sendDelayAction();
        }

        @Override
        public boolean deliverSelfNotifications() {
            return true;
        }
    }