【发布时间】:2021-08-01 08:03:27
【问题描述】:
我有一个定期执行的 Worker。它连接到 BLE 设备并从中同步数据。连接由观察者完成。 doWork 调用 syncRides()。 syncRides 创建了一个 observeForever,并开始连接,当连接建立时调用 BleClient.runBleSync()。
我担心的是每 15 分钟(最短 WorkManager 时间)调用一次“observeForever”,并创建未删除的 observeForever。问题是 BleWorker 没有用于创建“BleClient.connectionStatus.observe”而不是“BleClient.connectionStatus.observeForever”的 LifecycleOwner。我的问题是我是否应该担心使用 observeForever 并每 15 分钟触发一次。或者,也许您可以建议更好的选择,例如添加和删除观察者。
此外,在没有 GlobalScope.launch(Dispatchers.Main) 的情况下运行时,会出现此函数无法在后台线程上运行的错误。那么在Worker中运行时Dispatchers.Main是什么意思呢?
class BleWorker(appContext: Context, workerParams: WorkerParameters) : CoroutineWorker(appContext, workerParams) {
override suspend fun doWork(): Result {
return try {
try {
RLog.d("Run work manager")
syncRides()
val output: Data = workDataOf("KEY_RESULT" to 1)
Result.success(output)
} catch (e: Exception) {
RLog.d("exception in doWork ${e.message}")
Result.failure()
}
} catch (e: Exception) {
RLog.d("exception in doWork ${e.message}")
Result.failure()
}
}
private suspend fun syncRides() {
GlobalScope.launch(Dispatchers.Main) {
val bleDevice = SharedPreferenceHelper.getBleMac()
if (bleDevice != null && BleClient.connectionStatus.value == BleClient.ConnectionStatus.NOT_CONNECTED) {
BleClient.connect(bleDevice)
}
BleClient.connectionStatus.observeForever {
RLog.d("Observing $it")
when (it) {
BleClient.ConnectionStatus.CONNECTED -> {
GlobalScope.launch(Dispatchers.IO) {
RLog.d("Running sync")
BleClient.runBleSync()
}
}
else -> {
RLog.d("No status")
}
}
}
}
}
BleClient:
object BleClient {
val connectionStatus = MutableLiveData(ConnectionStatus.NOT_CONNECTED)
fun connect(mac: String) {
//do some magic
connectionStatus.postValue(ConnectionStatus.CONNECTED)
}
}
【问题讨论】:
-
IMO
LiveData不能替代 listener 。您的用例显然是 Listener 的实现。我认为您可以更好地为此使用侦听器,因为您已经拥有BleClient的对象。LiveData似乎是这个用例的过度杀伤力,因为它具有生命周期意识,并且在您的案例中没有可用的生命周期所有者。
标签: android kotlin kotlin-coroutines android-workmanager