Android MVVM:当相同数据是来自不同服务器端点的响应的一部分时,如何从另一个存储库更新存储库中的数据?
Android MVVM: how can I update data in a Repository from another Repository, when same data is part of response from different server endpoints?
我正在尝试将 Android
项目移动到 MVVM
。当调用不同的服务器端点时,两个不同的存储库会获得相同的数据响应。让两者保持最新的正确方法是什么?
有不同的服务器端点返回 "UserData": "/get_user_data"
和 "/get_user_statistics"
。在 "UserStatisticsRepository"
中发出请求时,我需要更新 "UserRepository"
中的数据(returns UserData)。
我是否应该在 ViewModel 中注入两个存储库,然后通过 ViewModel 将 "UserData"
设置为 "UserRepository"
?在我看来,从 ViewModel 将数据设置到存储库并不是真正正确的方法...
比方说,我有:
data class UserData(
@SerializedName("id") val id: Int,
@SerializedName("name") val name: String
)
和
data class UserStatisticData(
@SerializedName("id") val id: Int,
@SerializedName("active_users_count") val activeUsersCount: Int,
@SerializedName("users") val users: List<UserData>
)
和
class UserStatisticRepository(...) {
...
suspend fun makeUserStatisticDataRequest(){
withContext(Dispatchers.IO) {
val networkResponse = myAppAPI?.getUserStatisticData(params)
try {
if (networkResponse!!.isSuccessful) {
_userStatisticData.value = networkResponse.body()?.userStatisticData
// TODO: Should I set UserData (networkResponse.body()?.userData) to UserRepository here???
// How can I access UserRepository?
} else {
throw UserStatisticDataResponseError(Exception("Response body error..."))
}
} catch (e: Exception) {
throw UserStatisticDataResponseError(Exception("Network error..."))
}
}
}
...
}
我不确定你的项目是如何设置的,但如果我遇到这种情况,我会:
要么有一个状态被两个存储库改变,让它成为反应性的。两个repostitory在构造时都可以将该状态作为参数,它们也可以改变状态。
一个被这两个调用改变的反应数据库。即,无论何时获取任何新的 UserData 实体,都会将其写入数据库。当我们需要 UserData 时,我们直接从 "Room" 之类的反应式数据库中监听它,而不是直接从那些 API 端点监听。
什么时候做什么?
如果我不必保留获取的数据,我会选择第一个选项&我很乐意在应用程序关闭后丢失所有数据,因为如果我希望来自这些端点的数据能够在应用程序重新启动时继续存在会选择第二个选项。
对于第一个选项,代码可能如下所示:
data class UserDataSource(val userDataList : List<UserData>)
class UserDataRepo(val subject : PublishSubject<UserDataSource>){
UserdataService.getUserData(userID).subscribe{
// Do calculations to find the old list of user and edit or update the new user
subject.onNext(UserDataSource(newUserList))
}
}
class UserStatRepo(subject : PublishSubject<UserDataSource>){
UserdataService.getUserStat().subscribe{
// Do calculations to find the old list of user and edit or update the new user
subject.onNext(UserDataSource(newUserList))
}}
在Ui订阅userDataSource主题..
class UserDataViewModel{
val userDataSource = PublishSubject.create<userDataSource>()
val userDataRepository = UserDataRepo (userDataSource)
val userDataRepository = UserStatRepo (userDataSource)
}
我正在尝试将 Android
项目移动到 MVVM
。当调用不同的服务器端点时,两个不同的存储库会获得相同的数据响应。让两者保持最新的正确方法是什么?
有不同的服务器端点返回 "UserData": "/get_user_data"
和 "/get_user_statistics"
。在 "UserStatisticsRepository"
中发出请求时,我需要更新 "UserRepository"
中的数据(returns UserData)。
我是否应该在 ViewModel 中注入两个存储库,然后通过 ViewModel 将 "UserData"
设置为 "UserRepository"
?在我看来,从 ViewModel 将数据设置到存储库并不是真正正确的方法...
比方说,我有:
data class UserData(
@SerializedName("id") val id: Int,
@SerializedName("name") val name: String
)
和
data class UserStatisticData(
@SerializedName("id") val id: Int,
@SerializedName("active_users_count") val activeUsersCount: Int,
@SerializedName("users") val users: List<UserData>
)
和
class UserStatisticRepository(...) {
...
suspend fun makeUserStatisticDataRequest(){
withContext(Dispatchers.IO) {
val networkResponse = myAppAPI?.getUserStatisticData(params)
try {
if (networkResponse!!.isSuccessful) {
_userStatisticData.value = networkResponse.body()?.userStatisticData
// TODO: Should I set UserData (networkResponse.body()?.userData) to UserRepository here???
// How can I access UserRepository?
} else {
throw UserStatisticDataResponseError(Exception("Response body error..."))
}
} catch (e: Exception) {
throw UserStatisticDataResponseError(Exception("Network error..."))
}
}
}
...
}
我不确定你的项目是如何设置的,但如果我遇到这种情况,我会:
要么有一个状态被两个存储库改变,让它成为反应性的。两个repostitory在构造时都可以将该状态作为参数,它们也可以改变状态。
一个被这两个调用改变的反应数据库。即,无论何时获取任何新的 UserData 实体,都会将其写入数据库。当我们需要 UserData 时,我们直接从 "Room" 之类的反应式数据库中监听它,而不是直接从那些 API 端点监听。
什么时候做什么?
如果我不必保留获取的数据,我会选择第一个选项&我很乐意在应用程序关闭后丢失所有数据,因为如果我希望来自这些端点的数据能够在应用程序重新启动时继续存在会选择第二个选项。
对于第一个选项,代码可能如下所示:
data class UserDataSource(val userDataList : List<UserData>)
class UserDataRepo(val subject : PublishSubject<UserDataSource>){
UserdataService.getUserData(userID).subscribe{
// Do calculations to find the old list of user and edit or update the new user
subject.onNext(UserDataSource(newUserList))
}
}
class UserStatRepo(subject : PublishSubject<UserDataSource>){
UserdataService.getUserStat().subscribe{
// Do calculations to find the old list of user and edit or update the new user
subject.onNext(UserDataSource(newUserList))
}}
在Ui订阅userDataSource主题..
class UserDataViewModel{
val userDataSource = PublishSubject.create<userDataSource>()
val userDataRepository = UserDataRepo (userDataSource)
val userDataRepository = UserStatRepo (userDataSource)
}