android.database.ContentObserver#onChange(boolean, android.net.Uri) 多次回撥的妥協處理方案
阿新 • • 發佈:2018-12-21
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)