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
代码第一个订阅者订阅,最后一个订阅者取消订阅?
请查看 MutableSharedFlow
的 subscriptionCount
属性,它可能就是您要查找的内容。它的类型为 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
我创建了一个位置存储库,负责收集位置数据并将其传输给任何收听者,现在的代码如下所示:
@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
代码第一个订阅者订阅,最后一个订阅者取消订阅?
请查看 MutableSharedFlow
的 subscriptionCount
属性,它可能就是您要查找的内容。它的类型为 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