ContentObserver onChange 同时还在处理之前的 onChange
ContentObserver onChange while still working on previous onChange
我的应用程序通过远程命令将联系人添加到电话簿。一条命令可以添加的联系人数量没有限制。
应用程序使用服务内的 ContentObserver 监听添加的联系人的变化。 onChange() 的处理可能需要一些时间,因为应用程序需要查找哪个联系人已更新以及哪些字段受到影响。
问题是,当收到一次添加多个联系人(例如 200 个)的命令时,ContentObserver 会收到重叠的 onChange()。也就是说,它在处理前一个事件时获得 onChange() 。这种重叠会导致问题。
处理此问题的最佳方法是什么?
理想情况下,我想要的是:如果在处理前一个时发生新的 onChange(),则放弃前一个的工作并从新的开始。但是该怎么做呢?
我遇到了同样的问题,我这样解决了这个问题,例如,如果您有 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;
}
}
我的应用程序通过远程命令将联系人添加到电话簿。一条命令可以添加的联系人数量没有限制。
应用程序使用服务内的 ContentObserver 监听添加的联系人的变化。 onChange() 的处理可能需要一些时间,因为应用程序需要查找哪个联系人已更新以及哪些字段受到影响。
问题是,当收到一次添加多个联系人(例如 200 个)的命令时,ContentObserver 会收到重叠的 onChange()。也就是说,它在处理前一个事件时获得 onChange() 。这种重叠会导致问题。
处理此问题的最佳方法是什么?
理想情况下,我想要的是:如果在处理前一个时发生新的 onChange(),则放弃前一个的工作并从新的开始。但是该怎么做呢?
我遇到了同样的问题,我这样解决了这个问题,例如,如果您有 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;
}
}