视频软件App开发引领数字内容创作与分享的新时代
564
2022-10-25
MVP 框架(Mosby)的 Demo 和简单源码分析
MVPMosbyDemo
void createPresenter() { P presenter = delegateCallback.getPresenter(); if (presenter == null) { presenter = delegateCallback.createPresenter(); } if (presenter == null) { throw new NullPointerException("Presenter is null! Do you return null in createPresenter()?"); } delegateCallback.setPresenter(presenter); }
它就是判断然后创建Presenter,这里会调用我们在Fragment实现的createPresenter(),presenter由我们自定义;注意,这里会判断是否为null,也就是在Fragment的onViewCreated的时候会检查createPresenter()是否为空,很容易忘写了报这个错。 attachView()方法:
void attachView() { getPresenter().attachView(delegateCallback.getMvpView()); }
调用了presenter的attachView方法,并将MvpView传递过去,看下MvpPresenter的基本实现类MvpBasePresenter:
public class MvpBasePresenter
继承自MvpViewStateFragment,需要设置setRetainInstance(true); 增加了ViewState类,用来保存和恢复view的状态数据。它只有一个方法public void apply(V view, boolean retained);用来恢复mvpview的状态,它的直接子类有LceViewState和RestorableViewState,前者是具有lce恢复功能,常用的是RetainingLceViewState,后者是具有parcelable保存恢复功能。他两的子类很多,其中AbsParcelableLceViewState实现了实现了这两个接口,一般常用的有:ArrayListLceViewState可以存放list,ParcelableDataLceViewState可以存放Parcelable对象,SerializeableLceViewState存放Serializable对象。 由于增加了ViewState,相应的BaseMvpDelegateCallback扩展成了BaseMvpViewStateDelegateCallback,增加了对ViewState的处理,FragmentMvpViewStateDelegateImpl扩展了FragmentMvpDelegateImpl,主要增加了对状态保存,fragment意外销毁的数据保存,比如旋转屏幕,对onCreate\onActivityCreated\onSaveInstanceState这3个方法进行处理:
@Override public void onCreate(Bundle saved) { super.onCreate(saved); ((MvpViewStateInternalDelegate) getInternalDelegate()).createOrRestoreViewState(saved); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); ((MvpViewStateInternalDelegate) getInternalDelegate()).applyViewState(); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); ((MvpViewStateInternalDelegate) getInternalDelegate()).saveViewState(outState); }
调用MvpViewStateInternalDelegate的相应方法,创建/恢复/保存ViewState,在createOrRestoreViewState中首先判断用户是否返回了ViewState,根据是否需要Parcelable意外保存做了判断
if (savedInstanceState != null && viewStateSupport.getViewState() instanceof RestorableViewState) { ViewState restoredViewState = ((RestorableViewState) viewStateSupport.getViewState()).restoreInstanceState( savedInstanceState);//从fragment oncreate参数savedInstanceState读取丢失的数据 boolean restoredFromBundle = restoredViewState != null; if (restoredFromBundle) { viewStateSupport.setViewState(restoredViewState); applyViewState = true; return true; } }
接着在onActivityCreated中调用applyViewState恢复数据,delegate.getViewState().apply(delegate.getMvpView(), retainingInstance);交给相应的ViewState处理恢复。 在意外销毁时,onSaveInstanceState回调saveViewState,判断isRetainInstance(),state等再去保存数据。
//省略为空判断 boolean retainingInstanceState = delegate.isRetainInstance(); if (viewState != null && !retainingInstanceState && !(viewState instanceof RestorableViewState)) { throw new IllegalStateException( "ViewState " + viewState.getClass().getSimpleName() + " of " + /*...省略报错信息*/); } // Save the viewstate if (viewState != null && viewState instanceof RestorableViewState) { ((RestorableViewState) viewState).saveInstanceState(outState);//保存到Bundle中 }
####MvpLceViewStateFragment 它把LCE和ViewState合起来了,一般可以直接使用它。 ###MvpFrameLayout/MvpLinearLayout/MvpRelativeLayout mosby后来的版本才加对Layout的支持,这样意味这可以把功能模块缩小至Layout,以前是fragment+presenter,如果使用layout+presenter,相比fragment更灵活。举个例子,知乎的回答详情页面,回答详情区域、点赞、收藏都是单独的功能逻辑,而且都具有LCE特点,采用mvplayout的话实现更为方便。 Mvp*Layout和Mvp*Fragment原理类似,只不过view的生命周期和fragment不同。 目前V2.0.1,官方提供了mvpLayout、MvpViewState*Layout的支持,未提供MvpLce*Layout的支持,可能正在更新吧,可以自己扩展下。
update:自定义增加了MvpLceViewStateFrameLayout.java
效果图:
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~