【发布时间】:2020-10-15 03:27:54
【问题描述】:
我希望能够将不同的LiveData<X> 连接到同一个Observer。
到目前为止,我的小模块一直运行得非常好,但是为了避免将ViewModel 链接到LifecycleOwner,我提供了一种方法让模块在所有者为空时使用.observeForever() 函数,
观察者被包裹在一个更大的里面,它存储了一个int 值,该值声明每个 LiveData 上的 onChange() 是否是第一个......这样做是因为在某些情况下我需要忽略最初的 onChange() 回调。
因为可能有很多观察者(跟踪这个 int 值)...取决于 LiveData<X> 的数量(文档称它们为“来源”),我很容易清除所有观察者liveData.removeObservers(owner); 函数,自动清除该特定所有者的所有观察者。
但是由于所有者为空,现在我需要将所有观察者的引用保存在一个单一的中,并按名称删除它们liveData.removeObserver(observer);
我首先担心的是,通过在每次迭代中声明 new,我将永远失去对该观察者的引用。
如果是这种情况,我可以删除包装器中的观察者,正如预期的那样,所有观察者都是一样的,但首先想到的是,显而易见的事情是不要破坏最内在的观察者,但外在的观察者,因为这也会破坏内在的观察者。
问题是外面的不一样,而里面的却是普通的,所以:
我应该删除哪个,应该如何声明?
private RunTimeObserverWrapper<? super T> runTimeObserverWrapper;
/*This is the recent change I made in the hopes of being able to remove it/them */
private void connectObservers(
List<LiveData<T>> liveDatas,
boolean ignoreInitialization
) {
this.listLiveData = liveDatas;
Observer<? super T> itemObserver = itemObserverInitializer();
/*This is the common observer*/
for (LiveData<T> liveData: listLiveData
) {
if (!liveData.hasObservers()) {
runTimeObserverWrapper = new RunTimeObserverWrapper<>(ignoreInitialization, itemObserver);
/*This is the recent change I made placing it as a field variable*/
// RunTimeObserverWrapper<? super T> runTimeObserverWrapper = new RunTimeObserverWrapper<>(ignoreInitialization, itemObserver);
/*This was working as intended, but I want to disassociate the module from the LifeCycleOwner*/
if (owner != null) {
liveData.observe(
owner,
runTimeObserverWrapper
);
} else {
liveData.observeForever(
runTimeObserverWrapper
);
}
/*New Snippet*/
// liveData.observe(
// owner,
// runTimeObserverWrapper
// );
/*Old snippet*/
}
}
}
public void destroyObserversAndList() {
for (LiveData<T> liveData: listLiveData
) {
// liveData.removeObservers(owner);
/*This was correctly removing ALL Observers*/
if (owner != null) {
liveData.removeObservers(owner);
} else {
liveData.removeObserver(runTimeObserverWrapper);
}
/*This is the new snippet to account for a lack of LifeCycleOwner*/
}
listLiveData.clear();
}
所以,如您所见,我担心的是,通过调用 liveData.removeObserver(runTimeObserverWrapper);,我只会删除迭代中由 new 定义的最后一个观察者。
我该怎么办?
【问题讨论】:
标签: java android-lifecycle android-livedata observer-pattern