我已经迁移到 Mosby 3.0.3,现在正在研究PresenterManager
. 对我来说,关于 Activity、Fragment 和 ViewGroup 的演示者的生命周期并不完全清楚。我已经查看了ViewGroupMvpDelegateImpl
,FragmentMvpDelegateImpl
并且ActivityMvpDelegateImpl
无法 100% 确定演示者何时被终止。
据我了解,默认情况下keepPresenterInstance
总是keepPresenterOnBackstack
如此,我们有这样的情况:
Fragment 的 Presenter 一直存在,直到它的 Fragment 从 backstack 中移除或整个进程终止。在这种情况下,我依赖以下方法
FragmentMvpDelegateImpl
:protected boolean retainPresenterInstance() { Activity activity = getActivity(); if (activity.isChangingConfigurations()) { return keepPresenterInstanceDuringScreenOrientationChanges; } if (activity.isFinishing()) { return false; } if (keepPresenterOnBackstack && BackstackAccessor.isFragmentOnBackStack(fragment)) { return true; } return !fragment.isRemoving(); }
但是 childFragmentManagers 中的 Fragments 或 FragmentPagerAdapter 中的 Fragments (也在另一个 Fragment 中)呢?
Activity 和 ViewGroup 的 Presenter 一直存在,直到他们的 Activity 未完成或整个过程终止。在这种情况下,我依赖以下方法
ActivityMvpDelegateImpl
:static boolean retainPresenterInstance(boolean keepPresenterInstance, Activity activity) { return keepPresenterInstance && (activity.isChangingConfigurations() || !activity.isFinishing()); }
对于所有 ViewGroup,无论它们位于何处,都是如此吗?
问这个问题的原因是,在我们的应用程序中,我们有活动、片段、片段内的片段、自定义视图组,它们都有演示者。这个想法是在presenter中释放大量资源,detachView(final boolean retainInstance)
但在内存中保留一些轻量级的东西——比如inMemory缓存,以便在视图从后台恢复时重用它。
同样,我们使用 Dagger2,了解何时发布适当的子组件很重要。