【发布时间】:2021-05-04 14:51:32
【问题描述】:
MeetingViewModel
fun observeAttendeesJoined(): LiveData<Array<AttendeeInfo>>? {
return Repository.getAttendeesJoined()
}
有一个使用 kotlin 的对象声明的单例存储库。 Repository 有一个 BaseActivity 正在观察的实时数据。
存储库
fun getAttendeesJoined(): LiveData<Array<AttendeeInfo>>? {
if (attendeesJoined == null) {
attendeesJoined = MutableLiveData()
}
return attendeesJoined
}
基础活动
private fun observeAttendeesJoined() {
meetingViewModel.observeAttendeesJoined()?.observe(this) {
Timber.d(" :$LOG_APP_NAME: BaseActivity: :setObservers: onAttendeesJoined: $it")
lifecycleScope.launchWhenResumed {
onAttendeesJoined(it)
}
}
}
前台服务会更改相应可变实时数据的值。 BaseActivity 收到更新,我们正在显示小吃栏。 现在,当我们更改活动时,即使它不是由前台服务触发,也会再次触发相同的结果。
例如,如果我们在 activity A (that extends the BaseActivity) 中,并且前台服务将新与会者总数的值更改为 5,我们将在 activity A 中显示它,因为 5 用户已加入会议。用户在activity A 上花费了一些时间。一段时间后,当用户移动到activity B (that is also extending BaseActivity) 时,前台服务没有任何响应,activity B 收到与活动 A 收到的相同的最新更新,因此活动 B 也显示 5 个用户已加入的小吃吧会议,并且所有活动都继续这种模式。
MeetingViewModel
fun onAttendeesJoined(attendeeInfo: Array<AttendeeInfo>) {
Timber.d(" :$LOG_APP_NAME: MeetingViewModel: :onAttendeesJoined: :size: ${attendeeInfo.size}")
attendeeInfo.forEach {
Timber.d(" :$LOG_APP_NAME: MeetingViewModel: :onAttendeesJoined: $attendeeInfo")
}
Repository.setAttendeesJoined(attendeeInfo)
}
服务
override fun onAttendeesJoined(attendeeInfo: Array<AttendeeInfo>) {
attendeeInfo.forEach {
Timber.d(" :$LOG_APP_NAME: ChimeService: :onAttendeesJoined: :id: ${it.attendeeId} :externalId: ${it.externalUserId} :attendeeInfo: $it :responseSize: ${attendeeInfo.size}")
}
meetingViewModel.onAttendeesJoined(attendeeInfo)
}
每当前台服务更改相应的可变实时数据时,新活动(在我们的示例中为活动 B)只有在新数据 (5) 发生更改时才应获得更新,因为meetingViewModel.observeAttendeesJoined() 仅返回新数据。
如何接收活动中的唯一更新?
MeetingViewModel 的实例因每个活动而异,但存储库数据是单例(kotlin 的对象声明),不是吗?
我试图理解Transformations.map 和switchMap,但不知道如何使用它来解决问题。
谢谢你的期待。
【问题讨论】:
-
我想建议您简化存储库。 MutableLiveData 是一个非常轻量级的对象,因此没有理由延迟加载它。即使你这样做了,你的函数也没有理由返回一个可为空的,因为当你返回它时它不可能为空。我将完全删除该功能,只公开一个公共属性
val attendeesJoined = MutableLiveData()。
标签: android kotlin android-livedata android-mvvm android-livedata-transformations