Skip to content

Latest commit

 

History

History
128 lines (97 loc) · 2.99 KB

File metadata and controls

128 lines (97 loc) · 2.99 KB

观察者模式在 Android 中的应用

观察者模式是一种行为设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在 Android 开发中,观察者模式被广泛应用。

主要应用场景

1. LiveData(最典型的应用)

// 被观察者
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("新数据");

特点:

  • 自动感知生命周期,避免内存泄漏
  • 只有处于活跃状态的观察者会收到通知
  • 数据变化时自动通知观察者

2. RxJava

// 被观察者
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);

3. EventBus

// 注册观察者
EventBus.getDefault().register(this);

// 定义观察方法
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {
    // 处理事件
}

// 发送事件
EventBus.getDefault().post(new MessageEvent());

// 取消注册
EventBus.getDefault().unregister(this);

4. BroadcastReceiver

// 定义广播接收器(观察者)
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);

5. ViewModel + Data Binding

<!-- XML中绑定观察 -->
<TextView
    android:text="@{viewmodel.text}" />
// ViewModel中定义可观察数据
public class MyViewModel extends ViewModel {
    public final MutableLiveData<String> text = new MutableLiveData<>();
}

Android中观察者模式的优势

  1. 解耦:观察者和被观察者松耦合
  2. 实时响应:状态变化立即通知所有依赖项
  3. 生命周期感知:如LiveData能自动处理生命周期
  4. 灵活性:可以动态添加和删除观察者

实际开发建议

  1. 对于UI数据更新,优先使用LiveData
  2. 对于跨组件通信,可以考虑EventBus
  3. 对于复杂异步操作,RxJava是更好的选择
  4. 系统级事件通知使用BroadcastReceiver
  5. 注意及时取消注册观察者,避免内存泄漏