我有一个定期执行的Worker。它连接到BLE设备,并从它同步数据。连接是由观察者完成的。doWork调用syncRides()。syncRides创建了一个observeForever,并开始连接,当连接建立时BleClient.runBleSync()调用。
我关心的是" observer "每15分钟调用一次(最小WorkManager时间),并创建未删除的observveforever。问题是BleWorker没有生命周期所有者来创建" blecclient . connectionstatus .observe"而不是" blecclient . connectionstatus . observeforever "。我的问题是我是否应该担心使用observeForever并每15分钟触发它。或者你可以建议更好的选择,如添加和删除观察者。
另外,当没有运行GlobalScope.launch(Dispatchers.Main)时,有一个错误,这个函数不能在后台线程上运行。Dispatchers。在Worker中运行时的主要意思?
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)
}
}
我假设应用程序连接到另一个设备上的蓝牙任何同步数据。如果我的假设是正确的,首先,您应该将同步进程卸载到前台服务,因为该过程将花费很长时间。您仍然可以使用WorkManager进行调度。在前台服务中,您应该连接BLE并同步数据。为此,有不同的选择。如果你需要使用observable来观察连接状态,你应该使用MutableSharedFlow而不是MutableLiveData,这样你就可以通过在Service类中创建的生命周期范围来观察变化。然而,在我看来,更好的做法是将connect()函数转换为可挂起的函数。为此,您可以使用suspendCoroutine构建器进行转换。另外,如果同时从不同的线程调用connect函数,则必须使用锁来避免多个连接。Kotlin Coroutines为此提供了非阻塞锁。在将connect()函数转换为挂起函数之后,您可以以线性方式实现逻辑,这很容易并且不需要任何类型的观察。