我的视图模型中有以下内容
val currentStockPriceAsLiveData: LiveData<UiState> = stockPriceDataSource.latestStockList
.map { listOfStock ->
UiState.Success(listOfStock)
}.asLiveData()
我在 Activity 的 onCreate 方法中观察到这一点
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
lifecycleScope.launch {
lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.currentStockPriceAsLiveData.observe(this@FlowUseCase1Activity) { uiState ->
if (uiState != null) {
if(uiState is UiState.Success) {
Timber.d("Received ${uiState.stockList.first()}")
}
render(uiState)
}
}
}
}
}
我使用 RepeatOnLifeCycle 仅观察生命周期何时至少处于 STARTED 状态。这就像我将应用程序放在后台一样,它将停止观察。
但是,问题是当我将应用程序带回前台时,它会触发重复发射。当我第二次将应用程序置于后台时,它将触发三次发射。
来自我的日志:
00:00:05.274 23476-23476 D Received Stock(rank=1, name=Apple, symbol=AAPL, marketCap=2.37819317E12, country=United States, currentPrice=142.95015, currency=DOLLAR, priceTrend=UNKNOWN)
00:00:05.275 23476-23476 D Received Stock(rank=1, name=Apple, symbol=AAPL, marketCap=2.37819317E12, country=United States, currentPrice=142.95015, currency=DOLLAR, priceTrend=UNKNOWN)
00:00:05.276 23476-23476 D Received Stock(rank=1, name=Apple, symbol=AAPL, marketCap=2.37819317E12, country=United States, currentPrice=142.95015, currency=DOLLAR, priceTrend=UNKNOWN)
正如你所看到的,它就像同时触发了3次。
我认为这是因为当我将应用程序置于后台时,视图模型尚未被破坏,因此当我将应用程序放回前台时,它会创建后续观察者。
有办法避免这种情况吗?
您不必管理
LiveData
的生命周期。 LiveData
管理自己的生命周期。它将根据包含 Activity
和 Fragment
的生命周期暂停或恢复。
在
LiveData
中像这样使用
onCreate()
viewModel.currentStockPriceAsLiveData.observe(this@FlowUseCase1Activity) { uiState ->
if (uiState != null) {
if(uiState is UiState.Success) {
Timber.d("Received ${uiState.stockList.first()}")
}
render(uiState)
}
}
我不知道为什么它会重复。这可能是因为每次生命周期达到
STARTED STATE
时,您都会附加一个新的观察者。 LiveData
不需要每次生命周期发生变化时都附加。它管理自己的生命周期。仅调用一次如上onCreated()
所示的实时数据。