
1. 观察者模式的核心概念解析观察者模式Observer Pattern是Android开发中最常用的设计模式之一它定义了对象间一对多的依赖关系当一个对象状态发生改变时所有依赖它的对象都会自动收到通知并更新。这种模式在Android系统中无处不在从点击事件处理到数据绑定机制都深度依赖观察者模式。1.1 模式组成要素观察者模式包含四个关键角色Subject主题维护观察者列表提供注册和注销观察者的接口。在Android中典型的Subject角色包括Observable类Java原生支持LiveDataAndroid Architecture ComponentsRxJava中的ObservableObserver观察者定义更新接口用于接收主题状态变更通知。Android中的实现包括Observer接口DisposableObserverRxJavaLifecycleObserverAndroidXConcreteSubject具体主题维护具体状态状态改变时通知所有观察者。例如MutableLiveDataBehaviorSubjectRxJavaConcreteObserver具体观察者实现观察者接口保存对具体主题的引用。典型实现如Activity/Fragment中的匿名Observer类自定义的View.OnClickListener1.2 Android中的典型应用场景观察者模式在Android平台的应用远比想象中广泛UI事件处理View.setOnClickListener()是最简单的观察者模式实现数据绑定LiveData与ViewModel的组合广播机制LocalBroadcastManager的注册/发送生命周期感知LifecycleOwner与LifecycleObserver异步任务回调Retrofit的网络请求回调提示在面试中被问到观察者模式时一定要结合Android平台特性回答而不是仅停留在理论层面。面试官更看重你能否将设计模式与Android开发实践相结合。2. 观察者模式的实现方式对比2.1 Java原生实现Java提供了java.util.Observable类和java.util.Observer接口作为观察者模式的基础实现// 继承Observable类 public class WeatherData extends Observable { private float temperature; public void setMeasurements(float temp) { this.temperature temp; setChanged(); // 标记状态已改变 notifyObservers(); // 通知观察者 } } // 实现Observer接口 public class CurrentConditionsDisplay implements Observer { Override public void update(Observable o, Object arg) { if (o instanceof WeatherData) { WeatherData data (WeatherData)o; // 更新显示逻辑 } } }优缺点分析优点Java标准库支持无需额外依赖缺点Observable是类而非接口限制了复用没有提供更细粒度的事件类型区分在Android中已逐渐被更现代的方案取代2.2 Android Architecture Components实现Google推荐的LiveDataViewModel架构class MyViewModel : ViewModel() { private val _data MutableLiveDataString() val data: LiveDataString _data fun updateData(newValue: String) { _data.value newValue } } class MyActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val viewModel ViewModelProvider(this).get(MyViewModel::class.java) viewModel.data.observe(this, Observer { newValue - // 更新UI }) } }核心优势生命周期感知自动管理订阅关系避免内存泄漏数据一致性确保UI显示最新数据线程安全主线程安全的postValue和setValue2.3 RxJava实现响应式编程库RxJava提供了更强大的观察者模式实现ObservableString observable Observable.create(emitter - { emitter.onNext(Data 1); emitter.onNext(Data 2); emitter.onComplete(); }); ObserverString observer new ObserverString() { Override public void onSubscribe(Disposable d) {} Override public void onNext(String s) { // 处理数据 } Override public void onError(Throwable e) {} Override public void onComplete() {} }; observable.subscribe(observer);进阶特性操作符链式调用map,filter,flatMap等线程调度subscribeOn,observeOn背压支持Flowable处理大量数据多事件类型onNext,onError,onComplete3. 观察者模式的Android面试要点3.1 高频面试问题解析问题1观察者模式与发布-订阅模式有什么区别回答要点观察者模式Subject直接维护Observer引用通常同步调用发布-订阅模式通过消息代理Broker解耦通常是异步的Android中的EventBus是典型的发布-订阅实现问题2如何避免观察者模式中的内存泄漏解决方案对于LiveData使用lifecycleOwner自动管理对于RxJava及时调用dispose()或使用CompositeDisposable对于普通观察者在onDestroy中取消注册使用弱引用WeakReference包装观察者问题3观察者模式在Android系统中的应用有哪些系统级应用案例ContentObserver监听ContentProvider数据变化BroadcastReceiver系统广播的监听机制ViewTreeObserver视图树变化监听TextWatcher文本输入监听接口3.2 性能优化与最佳实践避免过度通知使用DistinctUntilChanged操作符RxJava实现值相等比较LiveData线程模型选择viewModel.data .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe { /* 更新UI */ }复杂事件处理// 使用RxJava合并多个数据源 Observable.combineLatest( api.getUser(), db.getUserPreferences(), (user, prefs) - new UserData(user, prefs) ).subscribe(observer);生命周期管理模板代码class SafeObserverT( private val lifecycle: Lifecycle, private val delegate: ObserverT ) : ObserverT, LifecycleObserver { OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) fun onDestroy() { lifecycle.removeObserver(this) // 清理资源 } override fun onChanged(t: T) { if (lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED)) { delegate.onChanged(t) } } }4. 观察者模式的高级应用与陷阱规避4.1 跨组件通信方案全局事件总线谨慎使用// 使用RxJava实现简单事件总线 public class RxEventBus { private final PublishSubjectObject bus PublishSubject.create(); public void post(Object event) { bus.onNext(event); } public T ObservableT observe(ClassT eventType) { return bus.ofType(eventType); } }Fragment间通信// Parent Fragment class ParentFragment : Fragment() { private val sharedViewModel: SharedViewModel by activityViewModels() fun sendData() { sharedViewModel.data.value Hello } } // Child Fragment class ChildFragment : Fragment() { private val sharedViewModel: SharedViewModel by activityViewModels() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { sharedViewModel.data.observe(viewLifecycleOwner) { data - // 接收数据 } } }4.2 常见陷阱与解决方案陷阱1通知顺序不可控解决方案使用MediatorLiveData控制多个数据源RxJava中使用concat确定顺序陷阱2观察者处理耗时操作正确做法liveData.observe(this) { data - // 错误在主线程执行耗时操作 viewModelScope.launch(Dispatchers.Default) { // 正确在后台处理 val result processData(data) withContext(Dispatchers.Main) { updateUI(result) } } }陷阱3重复订阅导致重复通知优化方案// 使用SingleLiveEvent避免重复通知 public class SingleLiveEventT extends MutableLiveDataT { private final AtomicBoolean mPending new AtomicBoolean(false); Override public void observe(NonNull LifecycleOwner owner, NonNull Observer? super T observer) { super.observe(owner, t - { if (mPending.compareAndSet(true, false)) { observer.onChanged(t); } }); } Override public void setValue(T value) { mPending.set(true); super.setValue(value); } }4.3 测试策略单元测试观察者逻辑Test fun testLiveDataObservation() { val liveData MutableLiveDataString() val observer mockObserverString() liveData.observeForever(observer) liveData.value test verify(observer).onChanged(test) }RxJava测试调度器Rule public final TestSchedulerRule testSchedulerRule new TestSchedulerRule(); Test public void testRxChain() { TestObserverString testObserver observable .test() .assertNoErrors() .assertValueCount(2) .assertComplete(); }UI测试观察者更新Test fun testUIUpdate() { val scenario launchFragmentInContainerMyFragment() scenario.onFragment { fragment - fragment.viewModel.data.value expected Espresso.onView(withId(R.id.textView)) .check(matches(withText(expected))) } }观察者模式作为Android开发的核心设计模式深入理解其原理和各种实现方式的优缺点能够帮助开发者在面试中脱颖而出也能在实际项目中构建更健壮、可维护的应用架构。关键在于根据具体场景选择合适的实现方案并处理好生命周期管理和线程安全问题。