1. 程式人生 > >android.database.ContentObserver#onChange(boolean, android.net.Uri) 多次回撥的妥協處理方案

android.database.ContentObserver#onChange(boolean, android.net.Uri) 多次回撥的妥協處理方案

android.database.ContentObserver#onChange(boolean, android.net.Uri)

在呼叫資料庫監聽的方法的時候發現,該方法會被多次觸發。比如,只是增加或者刪除了一條資料,但是實際上,無論是增加還是刪除,每次該方法都會被回撥兩次。

對於既定的事實,尚不清楚此設計的初衷。不過,我們並不想做重複的邏輯。解決方案是:?

  1. 在收到回撥之後,立即反註冊,防止重複接收相同回撥
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();
                }
            };
        }
  1. 在刪除/增加 操作的時候,先註冊監聽。
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)

奇怪的夜晚