Kotlin Flows,在没有活跃订阅者时执行代码

Kotlin Flows, executing code when there are no active subscribers

我创建了一个位置存储库,负责收集位置数据并将其传输给任何收听者,现在的代码如下所示:

@Singleton
class LocationRepository @Inject constructor(
    app: Application
) {

    private val _location = MutableStateFlow<Location?>(null)
    private val subscribers = AtomicInteger()
    val location: Flow<Location?> = _location.onSubscription {
        if (subscribers.getAndIncrement() == 0)
            startUpdates()
    }.onCompletion {
        if (subscribers.decrementAndGet() == 0)
            stopUpdates()
    }

    private val client = LocationServices.getFusedLocationProviderClient(app)
    private val locCb = object : LocationCallback() {
        override fun onLocationResult(var1: LocationResult?) {
            newLocationResult(var1)
        }
        override fun onLocationAvailability(var1: LocationAvailability) {}
    }
    private val request = LocationRequest.create()

    init {
        request.priority = LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY
        request.interval = 5000L
        request.fastestInterval = 2500L
    }


    private fun startUpdates() { //code to start getting location updates }
    private fun stopUpdates() { //code to stop getting location updates }

}

现在我正在使用 AtomicInteger 处理当前的订阅者数量,有没有办法自动 运行 startUpdates 代码和 stopUpdates 代码第一个订阅者订阅,最后一个订阅者取消订阅?

请查看 MutableSharedFlowsubscriptionCount 属性,它可能就是您要查找的内容。它的类型为 StateFlow<Int> 并向此共享流发出订阅者(活动收集器)的数量。示例:

_location.subscriptionCount
    .map { count -> count > 0 } // map count into active/inactive flag
    .distinctUntilChanged() // only react to true<->false changes
    .onEach { isActive -> // configure an action
        if (isActive) startUpdates() else stopUpdates()
    }
    .launchIn(scope) // launch it