KunMinX / UnPeek-LiveData

LiveData 数据倒灌:别问,问就是不可预期 - Perfect alternative to SingleLiveEvent, supporting multiple observers.
1.2k stars 120 forks source link

针对使用两个ConcurrentHashMap的问题优化,可参考 #16

Open liweiGe opened 3 years ago

liweiGe commented 3 years ago

observerStateMap 这个map 感觉没有存在的必要,可以更加精简

private final ConcurrentHashMap<Observer<? super T>, ChangeablePair<Observer<? super T>, Boolean>> observerProxyMap = new ConcurrentHashMap();

这是我的想法,一个map就可以搞定 image

我觉得数据上会更好

另外针对这一行代码 image 改造成如下: image

KunMinX commented 3 years ago

@liweiGe

感谢你的分享和启发!

为此我的做法是,将 state 作为 ObserverProxy 的字段来管理,这样我们保留了语义的明确,没有增加学习成本,且让 Map 及其元素的使用更为简便。

private final ConcurrentHashMap<Observer<? super T>, ObserverProxy> observerMap = new ConcurrentHashMap();
@Override
    public void onChanged(T t) {
      ObserverProxy proxy = observerMap.get(target);
      if (proxy != null && proxy.state) {
        proxy.state = false;
        if (t != null || isAllowNullValue) {
          target.onChanged(t);
        }
      }
    }

目前已将本次修改的结果纳入 V6.1 更新。