android.database.ContentObserver#onChange(boolean, android.net.Uri)
在调用数据库监听的方法的时候发现,该方法会被多次触发。比如,只是增加或者删除了一条数据,但是实际上,无论是增加还是删除,每次该方法都会被回调两次。
对于既定的事实,尚不清楚此设计的初衷。不过,我们并不想做重复的逻辑。解决方案是:?
- 在收到回调之后,立即反注册,防止重复接收相同回调
if (activity != null) {
resolver = activity.getContentResolver();
calendarObserver = new ContentObserver(mMainHandler) {
// @Override
// public void onChange(boolean selfChange) {
// super.onChange(selfChange);
// LogUtils.d(selfChange);
// }
@Override
public void onChange(boolean selfChange, Uri uri) {
super.onChange(selfChange, uri);
LogUtils.i(selfChange + " ,,, " + uri);
// onChange 每次都会被回调两次,甚至多次。
// 每次增删之前注册,收到立即反注册即可
resolver.unregisterContentObserver(calendarObserver);
refreshUI();
}
};
}
- 在删除/增加 操作的时候,先注册监听。
CalendarVM.deleteByCustom(getContext(), info)
.doOnSubscribe(t -> resolver
.registerContentObserver(Events.CONTENT_URI,
false, calendarObserver))
.subscribe(rows -> {
LogUtils.d("after delete: " + rows);
if (rows > 0) {
ToastHelper.show(Objects.requireNonNull(getContext()),
"delete success.." + rows);
}
}, Throwable::printStackTrace)