[Reminder]修正内存泄漏

This commit is contained in:
renwj
2022-01-26 18:27:32 +08:00
parent bc71fa590a
commit 70632376e0
2 changed files with 30 additions and 19 deletions

View File

@@ -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<LifecycleOwner, MutableList<IReminder>>()
ConcurrentHashMap<LifecycleOwner, MutableList<WeakReference<IReminder>>>()
}
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) {

View File

@@ -123,6 +123,7 @@ interface IReminder : Comparable<IReminder> {
override fun onViewDetachedFromWindow(v: View?) {
lifecycle.let {
if (it.currentState.isAtLeast(Lifecycle.State.CREATED)) {
this@lifecycleOwner.removeOnAttachStateChangeListener(this)
it.currentState = Lifecycle.State.DESTROYED
}
}