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