From 37447eb30c6af094c333318f906c099fc05acae2 Mon Sep 17 00:00:00 2001 From: Artem Chepurnoy Date: Thu, 3 Dec 2020 23:13:20 +0200 Subject: [PATCH 1/2] #52 Do not start indeterminate update loop if the view is detached --- .../CircularProgressBar.kt | 29 +++++++++++++------ 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/circularprogressbar/src/main/java/com/mikhaellopez/circularprogressbar/CircularProgressBar.kt b/circularprogressbar/src/main/java/com/mikhaellopez/circularprogressbar/CircularProgressBar.kt index 7033d9f..3600855 100755 --- a/circularprogressbar/src/main/java/com/mikhaellopez/circularprogressbar/CircularProgressBar.kt +++ b/circularprogressbar/src/main/java/com/mikhaellopez/circularprogressbar/CircularProgressBar.kt @@ -24,7 +24,10 @@ class CircularProgressBar(context: Context, attrs: AttributeSet? = null) : View( // Properties private var progressAnimator: ValueAnimator? = null - private var indeterminateModeHandler: Handler? = null + private var indeterminateModeHandlerOrNull: Handler? = null + private val indeterminateModeHandler: Handler + get() = indeterminateModeHandlerOrNull + ?: Handler().also(::indeterminateModeHandlerOrNull::set) // View private var rectF = RectF() @@ -36,6 +39,7 @@ class CircularProgressBar(context: Context, attrs: AttributeSet? = null) : View( isAntiAlias = true style = Paint.Style.STROKE } + private var isAttached: Boolean = false //region Attributes var progress: Float = 0f @@ -139,13 +143,12 @@ class CircularProgressBar(context: Context, attrs: AttributeSet? = null) : View( progressDirectionIndeterminateMode = ProgressDirection.TO_RIGHT startAngleIndeterminateMode = DEFAULT_START_ANGLE - indeterminateModeHandler?.removeCallbacks(indeterminateModeRunnable) progressAnimator?.cancel() - indeterminateModeHandler = Handler() - if (field) { - indeterminateModeHandler?.post(indeterminateModeRunnable) - } + if (value) { + if (isAttached) + indeterminateModeHandler.post(indeterminateModeRunnable) + } else indeterminateModeHandlerOrNull?.removeCallbacks(indeterminateModeRunnable) } var onProgressChangeListener: ((Float) -> Unit)? = null var onIndeterminateModeChangeListener: ((Boolean) -> Unit)? = null @@ -170,7 +173,8 @@ class CircularProgressBar(context: Context, attrs: AttributeSet? = null) : View( private val indeterminateModeRunnable = Runnable { if (indeterminateMode) { - postIndeterminateModeHandler() + if (isAttached) + postIndeterminateModeHandler() // whatever you want to do below this@CircularProgressBar.progressDirectionIndeterminateMode = this@CircularProgressBar.progressDirectionIndeterminateMode.reverse() if (this@CircularProgressBar.progressDirectionIndeterminateMode.isToRight()) { @@ -182,7 +186,7 @@ class CircularProgressBar(context: Context, attrs: AttributeSet? = null) : View( } private fun postIndeterminateModeHandler() { - indeterminateModeHandler?.postDelayed(indeterminateModeRunnable, DEFAULT_ANIMATION_DURATION) + indeterminateModeHandler.postDelayed(indeterminateModeRunnable, DEFAULT_ANIMATION_DURATION) } //endregion @@ -231,10 +235,17 @@ class CircularProgressBar(context: Context, attrs: AttributeSet? = null) : View( attributes.recycle() } + override fun onAttachedToWindow() { + super.onAttachedToWindow() + isAttached = true + indeterminateModeRunnable.run() + } + override fun onDetachedFromWindow() { + isAttached = false super.onDetachedFromWindow() progressAnimator?.cancel() - indeterminateModeHandler?.removeCallbacks(indeterminateModeRunnable) + indeterminateModeHandlerOrNull?.removeCallbacks(indeterminateModeRunnable) } //region Draw Method From 2267eca1ff4698f551347c7289dbc53d7930b3e8 Mon Sep 17 00:00:00 2001 From: Artem Chepurnoy Date: Thu, 3 Dec 2020 23:41:43 +0200 Subject: [PATCH 2/2] Disallow the aability to have multiple indeterminate runnables pending --- .../mikhaellopez/circularprogressbar/CircularProgressBar.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/circularprogressbar/src/main/java/com/mikhaellopez/circularprogressbar/CircularProgressBar.kt b/circularprogressbar/src/main/java/com/mikhaellopez/circularprogressbar/CircularProgressBar.kt index 3600855..597edc8 100755 --- a/circularprogressbar/src/main/java/com/mikhaellopez/circularprogressbar/CircularProgressBar.kt +++ b/circularprogressbar/src/main/java/com/mikhaellopez/circularprogressbar/CircularProgressBar.kt @@ -145,10 +145,11 @@ class CircularProgressBar(context: Context, attrs: AttributeSet? = null) : View( progressAnimator?.cancel() + indeterminateModeHandlerOrNull?.removeCallbacks(indeterminateModeRunnable) if (value) { if (isAttached) indeterminateModeHandler.post(indeterminateModeRunnable) - } else indeterminateModeHandlerOrNull?.removeCallbacks(indeterminateModeRunnable) + } } var onProgressChangeListener: ((Float) -> Unit)? = null var onIndeterminateModeChangeListener: ((Boolean) -> Unit)? = null