观察者模式是一种行为设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在 Android 开发中,观察者模式被广泛应用。
// 被观察者
LiveData<String> liveData = new MutableLiveData<>();
// 观察者
liveData.observe(this, new Observer<String>() {
@Override
public void onChanged(String newValue) {
// 更新UI
textView.setText(newValue);
}
});
// 改变数据
((MutableLiveData<String>) liveData).setValue("新数据");特点:
- 自动感知生命周期,避免内存泄漏
- 只有处于活跃状态的观察者会收到通知
- 数据变化时自动通知观察者
// 被观察者
Observable<String> observable = Observable.just("Hello", "World");
// 观察者
Observer<String> observer = new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {}
@Override
public void onNext(String s) {
Log.d("RxJava", s);
}
@Override
public void onError(Throwable e) {}
@Override
public void onComplete() {}
};
// 订阅关系
observable.subscribe(observer);// 注册观察者
EventBus.getDefault().register(this);
// 定义观察方法
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {
// 处理事件
}
// 发送事件
EventBus.getDefault().post(new MessageEvent());
// 取消注册
EventBus.getDefault().unregister(this);// 定义广播接收器(观察者)
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// 处理广播
}
};
// 注册观察者
IntentFilter filter = new IntentFilter("ACTION_REFRESH");
registerReceiver(receiver, filter);
// 发送广播(通知观察者)
Intent intent = new Intent("ACTION_REFRESH");
sendBroadcast(intent);
// 取消注册
unregisterReceiver(receiver);<!-- XML中绑定观察 -->
<TextView
android:text="@{viewmodel.text}" />// ViewModel中定义可观察数据
public class MyViewModel extends ViewModel {
public final MutableLiveData<String> text = new MutableLiveData<>();
}- 解耦:观察者和被观察者松耦合
- 实时响应:状态变化立即通知所有依赖项
- 生命周期感知:如LiveData能自动处理生命周期
- 灵活性:可以动态添加和删除观察者
- 对于UI数据更新,优先使用LiveData
- 对于跨组件通信,可以考虑EventBus
- 对于复杂异步操作,RxJava是更好的选择
- 系统级事件通知使用BroadcastReceiver
- 注意及时取消注册观察者,避免内存泄漏