将应用程序置于后台后观察生活数据时会创建新的观察者

问题描述 投票:0回答:1

我的视图模型中有以下内容

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次。

我认为这是因为当我将应用程序置于后台时,视图模型尚未被破坏,因此当我将应用程序放回前台时,它会创建后续观察者。

有办法避免这种情况吗?

android kotlin android-livedata android-lifecycle
1个回答
1
投票

您不必管理

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()
所示的实时数据。

© www.soinside.com 2019 - 2024. All rights reserved.