diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/reminder/Reminder.kt b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/reminder/Reminder.kt index fc883d70ec..6d642e35d1 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/reminder/Reminder.kt +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/reminder/Reminder.kt @@ -12,6 +12,7 @@ import com.mogo.eagle.core.utilcode.reminder.api.impl.ActivityReminder import kotlinx.coroutines.* import kotlinx.coroutines.android.asCoroutineDispatcher import java.lang.IllegalStateException +import java.lang.ref.WeakReference import java.util.* import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.CopyOnWriteArrayList @@ -44,7 +45,7 @@ object Reminder { } private val attaches by lazy { - ConcurrentHashMap>() + ConcurrentHashMap>>() } private val scope by lazy { @@ -106,7 +107,7 @@ object Reminder { attaches.getOrPut(attachTo, { mutableListOf() }).also { - it.add(reminder) + it.add(WeakReference(reminder)) } listener?.let { reminderListeners[reminder] = it @@ -144,15 +145,18 @@ object Reminder { val reminders = attaches.remove(attachTo) ?: return try { reminders.forEach { - if (it.isShowing()) { - it.hide() - } - enqueued.remove(it.key()) - showed.remove(it.key()) - if (it.isOverride()) { - queue.remove(it) - } else { - heap.remove(it) + val reminder = it.get() + if (reminder != null) { + if (reminder.isShowing()) { + reminder.hide() + } + enqueued.remove(reminder.key()) + showed.remove(reminder.key()) + if (reminder.isOverride()) { + queue.remove(reminder) + } else { + heap.remove(reminder) + } } } } catch (t: Throwable) { @@ -303,7 +307,10 @@ object Reminder { if (reminders == null || reminders.isEmpty()) { return false } - return reminders.find { it.isShowing() } != null + return reminders.find { + val ref = it.get() + return@find ref != null && ref.isShowing() + } != null } fun dismissAll(attachTo: LifecycleOwner) { @@ -313,13 +320,16 @@ object Reminder { } try { reminders.forEach { - if (it.isOverride()) { - queue.remove(it) - } else { - heap.remove(it) - } - if (it.isShowing()) { - it.hide() + val reminder = it.get() + if (reminder != null) { + if (reminder.isShowing()) { + reminder.hide() + } + if (reminder.isOverride()) { + queue.remove(reminder) + } else { + heap.remove(reminder) + } } } } catch (t: Throwable) { diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/reminder/api/IReminder.kt b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/reminder/api/IReminder.kt index cd021da78c..d7f6422a03 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/reminder/api/IReminder.kt +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/reminder/api/IReminder.kt @@ -123,6 +123,7 @@ interface IReminder : Comparable { override fun onViewDetachedFromWindow(v: View?) { lifecycle.let { if (it.currentState.isAtLeast(Lifecycle.State.CREATED)) { + this@lifecycleOwner.removeOnAttachStateChangeListener(this) it.currentState = Lifecycle.State.DESTROYED } }