[Reminder]修正内存泄漏
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user