MST

星途 面试题库

面试题:Kotlin观察者模式在复杂业务场景下的优化

假设在一个大型安卓项目中,使用Kotlin实现的观察者模式用于模块间通信,随着业务复杂度增加,出现了性能瓶颈和内存泄漏问题。请详细阐述你会从哪些方面进行优化,包括但不限于设计模式的改进、Kotlin语言特性的利用等,并给出优化思路和可能涉及的关键代码片段。
24.1万 热度难度
编程语言Kotlin

知识考点

AI 面试

面试题答案

一键面试

1. 设计模式改进

  • 弱引用观察者
    • 优化思路:避免被观察者对观察者的强引用,防止观察者因被强引用而无法被垃圾回收导致内存泄漏。
    • 关键代码片段
import java.lang.ref.WeakReference

class WeakReferenceObserver<T>(private val observer: Observer<T>) : Observer<T> {
    private var weakObserver: WeakReference<Observer<T>> = WeakReference(observer)

    override fun onChanged(data: T) {
        weakObserver.get()?.onChanged(data)
    }
}
  • 事件总线优化
    • 优化思路:使用更高效的事件总线库,如RxBus,集中管理事件的发布和订阅,减少不必要的观察者注册和通知。
    • 关键代码片段:假设使用RxBus,在模块中订阅事件:
RxBus.instance.toObservable(EventType::class.java)
  .subscribe { event ->
        // 处理事件
    }

在其他模块发布事件:

RxBus.instance.post(EventType())

2. Kotlin 语言特性利用

  • 使用协程优化通知流程
    • 优化思路:将观察者的通知逻辑放在协程中执行,避免阻塞主线程,提高性能。
    • 关键代码片段
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch

class Observable<T> {
    private val observers = mutableListOf<Observer<T>>()

    fun addObserver(observer: Observer<T>) {
        observers.add(observer)
    }

    fun removeObserver(observer: Observer<T>) {
        observers.remove(observer)
    }

    fun notifyObservers(data: T) {
        val scope = CoroutineScope(Dispatchers.Default)
        observers.forEach { observer ->
            scope.launch {
                observer.onChanged(data)
            }
        }
    }
}
  • 使用委托属性优化状态管理
    • 优化思路:通过委托属性简化观察者模式中的状态管理,减少样板代码,提高代码可读性和维护性。
    • 关键代码片段
class MyObservable {
    var data: String by Delegates.observable("initial value") { _, old, new ->
        // 通知观察者
        observers.forEach { it.onChanged(new) }
    }

    private val observers = mutableListOf<Observer<String>>()

    fun addObserver(observer: Observer<String>) {
        observers.add(observer)
    }

    fun removeObserver(observer: Observer<String>) {
        observers.remove(observer)
    }
}

3. 其他优化方面

  • 及时清理观察者
    • 优化思路:在模块销毁或不再需要观察时,及时从被观察者中移除观察者,防止内存泄漏。
    • 关键代码片段:在Activity的onDestroy方法中:
override fun onDestroy() {
    super.onDestroy()
    observable.removeObserver(this)
}
  • 减少不必要的通知
    • 优化思路:添加条件判断,只有当数据真正发生变化时才通知观察者。
    • 关键代码片段
class Observable<T> {
    private var currentData: T? = null
    private val observers = mutableListOf<Observer<T>>()

    fun addObserver(observer: Observer<T>) {
        observers.add(observer)
    }

    fun removeObserver(observer: Observer<T>) {
        observers.remove(observer)
    }

    fun setData(newData: T) {
        if (currentData == null || currentData != newData) {
            currentData = newData
            notifyObservers(newData)
        }
    }

    fun notifyObservers(data: T) {
        observers.forEach { it.onChanged(data) }
    }
}