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 特定组件,您应该如何引用利用 AsyncTasksActivity?关于 MVP 的教程显示了 Presenter 对象具有将 Activity 作为参数和 return 作为参数的方法;但是,如果你的 AsyncTask 需要很长时间并且你的 Activity 已经被诸如旋转变化之类的东西破坏了,你如何 return 到正确的 Activity?我目前将我的 AsyncTask 存储在 Fragment 中,以便在 Orientation Change 时保存。我很难找到实施 MVP 实践的解决方法。

如果我没有误解你的问题,你是在尝试将 retained non-UI fragment 用于 long-runing task,对吗? 以下是我对你的情况的建议:

  1. 为您的 Activity
  2. 制作 ActivityView interface
  3. 使用 WeakReference<ActivityView>Fragment Presenter 中引用 activity(以避免内存泄漏问题)
  4. Activity 重新创建时,尝试获取您的 retained fragment 并重置您的 Fragment PresenterActivityView。您可以查看此 Google Example 以了解如何在配置更改时处理加载数据。

总而言之,只需使用 WeakReference 来避免内存泄漏问题,并在重新创建 activity 时尝试重新设置 Presenterview

要回答您的问题,您无法避免将 Android class 传递给您的演示者 class。但是不是将 Android 对象作为参数传递,而是向您的视图 class 添加一个方法 returns 它(例如 getActivity())。

也就是说,我强烈建议您使用 Loader 而不是 AsyncTaskLoaders 专为您的用例而设计。它们也可以在后台 运行 但它们的生命周期与 ActivityFragment.

的生命周期相关联

如果您切换到 Loaders,请将 getLoaderManager() 之类的方法添加到您的视图界面。