美文网首页
观察者模式之RecycleView刷新

观察者模式之RecycleView刷新

作者: wa11e | 来源:发表于2017-11-07 16:47 被阅读0次

概念

定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象的状态发生改变时,会通知所有的观察者对象,使他们能自动更新自己.

举个栗子

AndroidButton的点击事件,当你点击触发点击事件时,它会根据之前的监听事件的不同产生不同的响应.

Android中的观察者模式

栗1: 除了上述的点击事件,在RecycleView中也存在着一种观察者模式,当你Adapter数据变化,需要刷新的时候,你需要通知Adapter刷新UI,而这里的通知实际上就是一种观察者模式.

private void setAdapterInternal(Adapter adapter, boolean compatibleWithPrevious,boolean removeAndRecycleViews) {
        ...
      if (adapter != null) {
            adapter.registerAdapterDataObserver(mObserver);
            adapter.onAttachedToRecyclerView(this);
      }
        ...
}   

我们可以发现在setAdapter()方法中它最终掉用了setAdapterInternal()方法,这里面判断当adapter不为空时,便为adapter注册一个观察者,而Adapter便是被观察者

 public void registerAdapterDataObserver(AdapterDataObserver observer) {
        mObservable.registerObserver(observer);
 }

而当我们去通知adapter去刷新新数据时,你会发现它调用了被观察者的notifychanged()方法.

 public final void notifyDataSetChanged() {
     mObservable.notifyChanged();
 }

 public void notifyChanged() {
      for (int i = mObservers.size() - 1; i >= 0; i--) {
                mObservers.get(i).onChanged();
      }
 }

我们最终发现,它调用了AdapterDataObserver的抽象类的onChanged()方法,而这个抽象类的实现类则是RecyclerViewDataObserver

    @Override
    public void onChanged() {
        assertNotInLayoutOrScroll(null);
        mState.mStructureChanged = true;

        setDataSetChangedAfterLayout();
        if (!mAdapterHelper.hasPendingUpdates()) {
            requestLayout();
        }
    }

我们不去追究其中具体的通知细节,只需要知道整个流程.

当你使用adapternotify()时,它会通知观察者(setAdapter()时注册的)说,我这里已经改变了,你该刷新了,然后观察者调用自己的实现类(RecyclerViewDataObserver)中的onChanged()方法刷新自己.

栗2:
大名鼎鼎的RxJava,是一个第三方库,它的主要思想是异步,非常适合在网络请求时使用,不过,它与观察者模式的巧妙结合,使用它,使得代码简洁明了,是响应式编程的一种体现,在这里我就不多提了,相信大家都非常熟悉,具体的分析就不做了.

结语

有错请指出,谢谢.

学无止境.

相关文章

网友评论

      本文标题:观察者模式之RecycleView刷新

      本文链接:https://www.haomeiwen.com/subject/tfmjmxtx.html