在Kotlin中,实现观察者模式时,处理订阅取消的关键是使用WeakReference
来引用观察者对象,以便在内存不足时可以被垃圾回收器回收。同时,在观察者注册时,将订阅者存储在一个可取消订阅的集合中。当需要取消订阅时,从该集合中移除对应的订阅者。以下是一个简单的示例:
import java.lang.ref.WeakReference
import java.util.concurrent.CopyOnWriteArrayList
interface Observer {
fun update(data: String)
}
class ConcreteObserver : Observer {
override fun update(data: String) {
println("Observer received data: $data")
}
}
class Observable {
private val observers = CopyOnWriteArrayList<WeakReference<Observer>>()
fun subscribe(observer: Observer) {
observers.add(WeakReference(observer))
}
fun unsubscribe(observer: Observer) {
observers.removeAll { it.get() == observer }
}
fun notifyObservers(data: String) {
observers.forEach { it.get()?.update(data) }
}
}
fun main() {
val observable = Observable()
val observer = ConcreteObserver()
observable.subscribe(observer)
observable.notifyObservers("Hello, Observer!")
// 取消订阅
observable.unsubscribe(observer)
// 再次通知观察者,此时不会有任何输出
observable.notifyObservers("Hello again, but no one is listening.")
}
在这个示例中,我们创建了一个Observable
类,它允许观察者通过subscribe
方法注册,并通过unsubscribe
方法取消订阅。我们使用CopyOnWriteArrayList
来存储观察者的弱引用,这样在迭代过程中可以安全地添加或删除元素。当我们需要通知观察者时,我们遍历这个列表并调用每个观察者的update
方法。由于我们使用了弱引用,所以当观察者不再被其他地方引用时,垃圾回收器可以回收它,从而避免内存泄漏。