From 2df4e144a913b705c50bde929c75744b251967d9 Mon Sep 17 00:00:00 2001 From: daqi Date: Wed, 28 Jun 2017 14:16:13 +0800 Subject: [PATCH] Fix ContentObserver unregister issue [Cause of Defect] In the ContentObserver callback procedure, the binder thread has no sync mechanism with handler thread. The ContentObserver#onChange method can get called after ContentResolver#unregisterContentObserver called in the very low probability. Bug: https://issuetracker.google.com/issues/63154326 Test: manual - check https://github.com/nanjingdaqi/ContentObserverDemo Change-Id: I0e3831eba7a9cc1a5bf0d30abe5dd0ec8259b0d4 Signed-off-by: daqi --- core/java/android/database/ContentObserver.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/core/java/android/database/ContentObserver.java b/core/java/android/database/ContentObserver.java index 5f01e300bf425..4795e979f6449 100644 --- a/core/java/android/database/ContentObserver.java +++ b/core/java/android/database/ContentObserver.java @@ -193,6 +193,11 @@ public abstract class ContentObserver { */ private void dispatchChange(boolean selfChange, Uri uri, int userId) { if (mHandler == null) { + synchronized (mLock) { + if (mTransport == null) { + return; + } + } onChange(selfChange, uri, userId); } else { mHandler.post(new NotificationRunnable(selfChange, uri, userId)); @@ -213,6 +218,11 @@ public abstract class ContentObserver { @Override public void run() { + synchronized (mLock) { + if (mTransport == null) { + return; + } + } ContentObserver.this.onChange(mSelfChange, mUri, mUserId); } }