如何解决在Android中预取存储库中数据之前的最佳做法
我正在尝试在项目中应用存储库模式,我有多个Repos用于不同的数据
下面显示了一个示例,我希望在使用数据之前准备好数据,那么这样做的最佳实践是什么...我的想法是,例如,如果片段1到片段2之间存在过渡,如果Fragment2想要要访问特定数据,则Fragment1必须在进行过渡时在存储库中准备好数据,
但是有具体的操作指南吗?我认为这与单一责任原则相反。
Wb.AutoSave
解决方法
基本上,在这种情况下,我将拥有一个像您一样的共享对象(但可能不是Kotlin object
,而是简单的class
),它是使用依赖注入创建的[特别是如果您要对其进行测试,后来])。然后,在Fragment1中,我将调用loadAllLanguages,在Fragment2中,我将仅检查数据是否已存在并返回它(如果没有的话)-查询新数据。
在这种情况下,我真的很喜欢Observer模式,因为您可以做的是将侦听器传递到存储库,并在数据准备好时通知它。但是请不要忘记在生命周期回调(例如onDestroy(在片段中)或onCleared(如果使用ViewModel)中)中注销观察者,因为它可能导致内存泄漏。
例如RxJava,Coroutines Flow和LiveData通常基于Observer模式,并提供了很好的功能来以“观察者”方式发出/收集数据。
毕竟,您不能保证数据将在过渡结束之后出现,因此理想情况下,您应该做的是在创建Fragment2时,它应该处于“加载”状态,并在数据最终到来时更改它/错误为抛出。
编辑:在评论中进行了一些讨论之后,我想添加一些伪代码来显示我对该主题的理解。基本上,OP具有多个片段,您可以从中导航到Fragment2。另一方面,OP具有多个存储库,这些存储库用于获取需要在片段中显示的数据。我建议的是这种数据流:
片段-> ViewModel / Presenter等-> UseCase->存储库-> Api /缓存
另一个问题是代码的重复。显然我们不能忽略它,但是我们可以通过使用UseCase大大限制重复。当然,在我们的ViewModel中,我们需要添加一些重复的代码来执行UseCase,然后将其推送到实际的Fragment中,仅此而已。同样,将来当我们进行单元测试时,它们会准确地告诉我们我们从何处获取数据以及我们正在使用什么来获取数据。创建BaseViewModel并将其放置在那里并不是一个好主意,因为最终我们将尝试使用此快捷方式来忽略应用程序中所有重复的代码,但是随着代码库的增长,这些快捷方式将变得更加困难保持。而且它们显然不会有任何好处。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。