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

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

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

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

  • 用无头残留片段启动一项活动。
  • 按钮
  • Presenter为可观察的延迟(5秒)响应调用FakeService。
  • Presenter对此可观察对象执行.cache()。
  • 演示者告诉视图保留这个可观察的。
  • 视图将观察值保存在保留的片段中。
  • Presenter订阅observable。
  • 用户进行配置更改(设备旋转)。 用户可以根据需要多次执行此操作。
  • OnPause通知演示者的CompositeSubscription清除和取消订阅所有当前订阅。
  • 活动被重新创建并重新使用现有的保留片段。
  • Activity的onResume检查保留片段的存储观察值是否为空。
  • 如果不为null,则通知Presenter订阅它。
  • 被保留的observable被订阅,并且因为.cache被调用,它只是将结果重播给新的订户而不再次调用服务。
  • 当Presenter向视图显示最终结果时,它还会将保留片段的已保存观察值设置为null。
  • 我想知道如果我正确地做到这一点,并且在Presenter中处理observable的订阅时是否有更高效或更优雅的方式来处理配置更改?


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

    随着新的变化; 不是将Observable从Presenter传递给Activity,而是将retainFragment作为configurationChange事件存储,而是将retainFragment设置为Presenter创建时的第二个“视图”。

    这种方式当onResume()发生在设备旋转后时,我不需要让Activity做一个丑陋的将Observable从retainFragment传递回Presenter的管道。

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


    听起来很对,很好! 一些建议:

  • 你可以使用Activity.onRetainNonConfigurationInstance() 。 我听说它在Android N中没有被弃用。如果你喜欢它,你可以继续使用保留的片段,这没有问题,但是如果你不喜欢使用片段,那么你并不需要。
  • 为什么只保留可观察的而不是整个主持人? 看起来可能有点浪费,建立一个新的主持人,也许你可以让它与可以“附着”和“分离”视图的相同实例一起工作。 但是,如果你的观察结果在你从任何视图中分离出来的时候发出,那么你又必须处理该怎么做,所以也许就足够了。
  • Dan Lew最近在他的Droidcond SF谈话中提到过你不应该使用cache() 。 他说replay()让你更好地控制正在发生的事情和replay().autoconnect()cache()的作用相同。 他说服了我,但请亲自看看。

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


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

    你的场景看起来像这样

  • 打开活动,创建演示者
  • 按Btn
  • Presenter为可观察的延迟(5秒)响应调用FakeService。
  • 配置改变了,演示者没有被破坏,Observable没有被解除绑定,所有的rx事件都被冻结了
  • 重新创建活动,重复使用演示者,演示者在查看以前加载的数据时显示,所有rx事件都解冻

    我认为这有帮助

  • 链接地址: http://www.djcxy.com/p/91949.html

    上一篇: RxJava with Presenter and retained fragment for configuration changes

    下一篇: How to access a gmail account I own using Gmail API?