我迁移到Mosby 3.0.3,现在研究PresenterManager的能力。对于我来说,对于活动、片段和ViewGroup,演示者的生命周期并不完全清楚。我查看过ViewGroupMvpDelegateImpl、FragmentMvpDelegateImpl和ActivityMvpDelegateImpl,无法100%地确定演示者何时被终止。
据我所知,在默认情况下,keepPresenterInstance和keepPresenterOnBackstack总是正确的,而且我们有这样的情况:
FragmentMvpDelegateImpl的方法:
受保护的布尔型keepPresenterInstanceDuringScreenOrientationChanges;(){活动活动= getActivity();if (activity.isChangingConfigurations()) {返回activity.isFinishing} if (activity.isFinishing()) {返回假;} if (keepPresenterOnBackstack & BackstackAccessor.isFragmentOnBackStack(fragment)) {返回真;}返回!fragment.isRemoving();}但是childFragmentManagers中的片段或者FragmentPagerAdapter中的片段(也在另一个片段中)呢?
ActivityMvpDelegateImpl的方法:
静态布尔型retainPresenterInstance(布尔型keepPresenterInstance,活动活动){返回keepPresenterInstance & (activity.isChangingConfigurations()欧元!activity.isFinishing());}对于所有的ViewGroups,无论他们居住在哪里,都是这样吗?
问这个问题的原因是,在我们的应用程序中,我们有活动,片段,片段中的片段,定制的视图组,所有这些都有演示者。这样做的目的是在detachView(final boolean retainInstance)中释放大量的演示者资源,但是在内存中保留一些轻量级的东西,比如inMemory缓存,以便在视图从后台恢复时重用它。
同样,我们使用Dagger2,理解何时发布适当的子组件非常重要。
发布于 2017-05-11 23:52:34
Fragment.setRetainInstanceState(true)时才会跨屏幕方向更改。这在Mosby3.x中不再是必需的,因为Mosby3.x使用PresenterManager来保持演示者跨方向变化。此外,由于Mosby 3.x演示程序将保留如果片段在后面的堆栈。这意味着,即使片段没有视图,因为片段位于后端堆栈上,所以UI小部件已经被销毁(调用了Fragment.onDestroyView()),演示程序实例也将被保留,如果用户弹出片段回堆栈,那么演示者就会被重用。但是,当片段位于后端堆栈上时,视图将与演示程序分离(presenter.detachView(true)将被调用),并在片段后面堆栈之上的片段之后重新附加。这是默认行为,适用于任何类型的片段,包括。ViewPager和嵌套ChildFragments在(子)回堆栈上。您可以将此配置为FragmentMvpDelegateImpl(keepPresenterInstance, keepPresenterOnBackstack)的构造函数参数,使其在屏幕方向更改期间根本不保留演示程序,或者在后台堆栈上不保留演示程序。@id/something),否则Android不知道如何映射视图(纵向视图到景观视图)。正如您已经正确观察到的,ViewGroups一直保持到“主机活动”死亡或ViewGroup以编程方式从父ViewGroup (如parentViewGroup.removeChild(indexOfViewGroup) )中删除为止。它住在哪里并不重要。请注意,如果您将ViewGroup放在一个片段中,那么它可能成功,也可能不起作用。我还没有想过/测试过那个边缘情况。不过,它仍然会考虑“主机活动”(而不是作为父代码的片段),但是,如果将一个片段放到后端堆栈(并推动一个新的片段),包含ViewGroup的片段的视图将被删除,这类似于以编程方式调用parentViewGroup.removeChild(indexOfViewGroup) (可能是FragmentManager内部调用它),以便销毁您的ViewGroup的演示者,但它可能不会被销毁(因为片段用户可以弹出该片段的后台堆栈)。在这种情况下,ViewGroup很可能会创建一个新的演示程序实例。如前所述,我还没有测试也没有考虑过这个边缘情况,但是(据我所知)无法获得对“宿主片段”的引用,因为ViewGroup不知道片段。我建议在片段中使用Mosby片段或Mosby ViewGroups,但不使用Mosby ViewGroup (如果确实有必要,请选择子片段)。您可以通过在相应的委托构造函数中设置布尔标志来配置所有这些行为。
检测该方法是否如预期的最简单方法是向createPresenter()方法和persenter.detachView()方法添加日志。此外,Mosby还为调试提供了一些日志记录。您可以在每个委托中启用它,即FragmentMvpDelegateImpl.DEBUG = true (例如,在Application.onCreate()中调用它)。请注意,您必须对每个委托(活动、片段、ViewGroup以及每个变体Mvp、Mvp+ViewState、Mvi)这样做。如果愿意,还可以以同样的方式为PresenterManager启用日志记录。
https://stackoverflow.com/questions/43922405
复制相似问题