我对Android
有点陌生,我正在编写一个应用程序。我正在开始更彻底地测试我的代码,因此,我想实施MVP设计策略,因为它为代码添加了更多的可测试层。使用MVP的一个我似乎无法理解的好处是,它如何帮助运行AsyncTasks
,因为它们是动态执行的。既然你想在Presenter
类中避免任何Android
特定的组件,你应该如何引用利用AsyncTasks
的Activity
?关于MVP的教程显示Presenter
对象具有将Activity
作为参数并返回给它的方法;但是,如果您的AsyncTask
花费了很长时间,并且您的Activity
已经通过诸如旋转变化之类的事情被破坏,您如何返回到正确的Activity
?我目前将AsyncTask
存储在Fragment
中,以便在方向更改时保存。我很难找到一个实现MVP实践的解决方案。
回答你的问题,你可以做的不多,以避免传递Android类到你的Presenter类。但是,不是将Android对象作为参数传递,而是在视图类中添加一个返回它的方法(例如getActivity()
)。
也就是说,我强烈建议您使用Loader
而不是AsyncTask
。Loaders
是专门为您的用例设计的。它们也可以在后台运行,但它们的生命周期与Activity
或Fragment
的生命周期相关联。
如果您切换到Loaders
,添加一个方法,如getLoaderManager()
到您的视图接口
如果我不理解你的问题,你正试图使用retained non-UI fragment
long-runing task
,对吗?以下是我对你的建议:
- 为你的
Activity
制作ActivityView interface
- 使用
WeakReference<ActivityView>
在Fragment Presenter
内引用您的活动(以避免内存泄漏问题) - 当
Activity
重新创建时,尝试获得retained fragment
并重置Fragment Presenter
的ActivityView
。你可以看看这个谷歌的例子,了解如何处理加载数据,而配置改变。
总之,只使用WeakReference
来避免内存泄漏问题,并尝试在重新创建活动时重新设置Presenter
的view