面试题答案
一键面试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) }
}
}