From d9afdb13b9de6373f0299783f8adfea1ec2fa900 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Ricau Date: Sun, 9 Jan 2022 05:44:06 +0100 Subject: [PATCH] Avoid blocking SharedPref read on config update Fixes #2117 --- .../src/main/java/leakcanary/LeakCanary.kt | 2 +- .../leakcanary/internal/HeapDumpControl.kt | 18 ++++++++++++++---- .../internal/activity/screen/AboutScreen.kt | 1 - 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/leakcanary-android-core/src/main/java/leakcanary/LeakCanary.kt b/leakcanary-android-core/src/main/java/leakcanary/LeakCanary.kt index 32e23d99c9..3112215b95 100644 --- a/leakcanary-android-core/src/main/java/leakcanary/LeakCanary.kt +++ b/leakcanary-android-core/src/main/java/leakcanary/LeakCanary.kt @@ -356,7 +356,7 @@ object LeakCanary { val previousConfig = field field = newConfig logConfigChange(previousConfig, newConfig) - HeapDumpControl.updateICanHasHeap() + HeapDumpControl.updateICanHasHeapInBackground() } private fun logConfigChange( diff --git a/leakcanary-android-core/src/main/java/leakcanary/internal/HeapDumpControl.kt b/leakcanary-android-core/src/main/java/leakcanary/internal/HeapDumpControl.kt index f5e44863cf..bdd2003e7f 100644 --- a/leakcanary-android-core/src/main/java/leakcanary/internal/HeapDumpControl.kt +++ b/leakcanary-android-core/src/main/java/leakcanary/internal/HeapDumpControl.kt @@ -1,6 +1,8 @@ package leakcanary.internal import android.app.Application +import android.os.Handler +import android.os.HandlerThread import com.squareup.leakcanary.core.R import leakcanary.AppWatcher import leakcanary.LeakCanary @@ -42,6 +44,12 @@ internal object HeapDumpControl { } } + private val backgroundUpdateHandler by lazy { + val handlerThread = HandlerThread("LeakCanary-Background-iCanHasHeap-Updater") + handlerThread.start() + Handler(handlerThread.looper) + } + private const val leakAssertionsClassName = "leakcanary.LeakAssertions" private val hasLeakAssertionsClass by lazy { @@ -53,8 +61,10 @@ internal object HeapDumpControl { } } - fun updateICanHasHeap() { - iCanHasHeap() + fun updateICanHasHeapInBackground() { + backgroundUpdateHandler.post { + iCanHasHeap() + } } fun iCanHasHeap(): ICanHazHeap { @@ -80,8 +90,8 @@ internal object HeapDumpControl { ) } } else if (!config.dumpHeapWhenDebugging && DebuggerControl.isDebuggerAttached) { - mainHandler.postDelayed({ - updateICanHasHeap() + backgroundUpdateHandler.postDelayed({ + iCanHasHeap() }, 20_000L) NotifyingNope { app.getString(R.string.leak_canary_notification_retained_debugger_attached) } } else Yup diff --git a/leakcanary-android-core/src/main/java/leakcanary/internal/activity/screen/AboutScreen.kt b/leakcanary-android-core/src/main/java/leakcanary/internal/activity/screen/AboutScreen.kt index 3f9de51281..5d6540e45d 100644 --- a/leakcanary-android-core/src/main/java/leakcanary/internal/activity/screen/AboutScreen.kt +++ b/leakcanary-android-core/src/main/java/leakcanary/internal/activity/screen/AboutScreen.kt @@ -53,7 +53,6 @@ internal class AboutScreen : Screen() { is Nope -> view.resources.getString( R.string.leak_canary_heap_dump_disabled_text, iCanHasHeap.reason() ) - } } }