带有Presenter的RxJava和用于配置更改的保留片段

时间:2016-05-30 20:23:59

标签: android rx-java mvp rx-android

我是RxJava的新手,并将其与MVP架构一起使用。

我发现了一些关于使用保留片段在配置更改时保存observable的示例(仍然不确定这是否是最好的方法)。我发现的例子是直接在Activity或Fragment上处理observable,而不是从Presenter处理。

所以我试验并设置了这个quick example(仅使用Reactivex的RxJava和RxAndroid lib)来测试,这似乎工作正常。这个例子的作用是:

  1. 使用无头保留片段启动活动。
  2. 按钮
  3. Presenter调用FakeService以查看延迟的(5秒)响应。
  4. Presenter对此可观察对象执行.cache()。
  5. Presenter告诉视图保留此可观察性。
  6. View将observable保存在保留的片段中。
  7. Presenter订阅了observable。
  8. 用户进行配置更改(设备轮换)。用户可以根据需要多次执行此操作。
  9. OnPause告诉Presenter的CompositeSubscription清除和取消订阅所有当前订阅。
  10. 重新创建活动并重新使用现有的保留片段。
  11. 活动onResume检查保留的片段存储的observable是否为空。
  12. 如果不为null,则告诉Presenter订阅它。
  13. 保留的observable被订阅,并且因为.cache被调用,它只是将结果重放给新订阅者而不再调用该服务。
  14. 当Presenter向视图显示最终结果时,它还会将保留的片段的已保存observable设置为null。
  15. 我想知道我是否正确地执行此操作,并且当在Presenter中处理可观察的订阅时,是否有更有效或更优雅的方式来处理配置更改?

    编辑: 感谢您的反馈。 基于此,我已经达到了我认为更清洁的解决方案,并且我已经更新了我的链接示例。

    随着新的变化;而不是将Observable从Presenter传递给Activity到retainFragment以存储一个configurationChange事件,而是将retainFragment设置为第二个" view"在创建时向演示者发送。

    这样当onResume()在设备轮换之后发生时,我不需要让Activity执行将Observable从retainFragment传递回Presenter的丑陋管道。

    Presenter可以与第二个"视图"进行交互。直接检查保留的observable本身并在需要时重新订阅。主要活动不再需要知道这个可观察的。突然间,这是一个更简单的视图层。

3 个答案:

答案 0 :(得分:3)

看起来不错,你可以看到这个例子 - https://github.com/krpiotrek/RetainFragmentSample

答案 1 :(得分:2)

听起来不错,干得好!一些建议:

  • 您可以使用Activity.onRetainNonConfigurationInstance()。我已经听说它在Android N中被取消了。如果您愿意,可以继续使用保留的片段,这没有问题,但您不必如果你不想使用碎片。
  • 为什么只保留可观察的而不是整个演示者?创建一个新的演示者似乎可能有点浪费,也许你可以使它与同一个实例一起工作,可以"附加"和"分离"一个看法。但是,如果你的观察结果在你与任何观点脱节时发生,你必须要处理如何处理,所以也许这样做已经足够好了。
  • Dan Lew最近提出了一个案例in his Droidcond SF talk,你不应该使用cache()。他说replay()可让您更好地控制所发生的事情,replay().autoconnect()cache()的工作方式相同。他说服了我,但要亲自看看。

答案 2 :(得分:-1)

此库https://github.com/MaksTuev/ferro包含商店屏幕数据和管理后台任务的另一种方式。

你的情况将会是这样的

  1. 打开活动,创建演示者
  2. 推Btn
  3. Presenter调用FakeService以查看延迟的(5秒)响应。
  4. 配置已更改,演示者未被销毁,Observable未被取消,所有rx事件都被冻结
  5. 重新创建活动,演示者重复使用,演示者显示以前加载的数据,所有rx事件都解冻

    我认为这有帮助