android-workmanager - 如何使 WorkManager.cancel() 立即生效?
问题描述
由于 WorkManager.cancel() 不是即时的,我已经复制了数据支持。
我试图通过将其设为 Single 来立即取消。但它不起作用。
private fun cancelSendEventsWorkManager(): Single<Boolean> =
Single.fromCallable {
WorkManager.getInstance(requireContext()).getWorkInfosByTag(SendEventstWorker.TAG).cancel(true)
}.subscribeOn(Schedulers.io())
并在单击按钮事件上像这样使用它:
Single.concat(
cancelSendEventsWorkManager(),
eventsViewModel.reportAllEvents(),
eventsViewModel.saveReportCompleted(),
.subscribeOn(Schedulers.io())
.doOnSubscribe {
EventBus.post(ShowProgress(getString(R.string.common_dialog_progress_generic)))
}
.doOnError {
EventBus.post(DismissProgress())
listener?.showUnknownErrorDialog()
}
.doOnComplete {
onReportAllEventAndCloseSessionSuccess(userName)
}
.subscribe(
{
}, {
onReportAllEventAndCloseSessionSuccess(userName)
}
})
发送EventstWorker
class SendEventstWorker constructor(context: Context, workerParameters: WorkerParameters) : RxWorker(context, workerParameters) {
private val db: RpxDatabase = RpxDatabase.getInstance(context)
private val eventRepository: EventRepository
init {
eventRepository = db.eventRepository
}
override fun createWork(): Single<Result> {
// Get the input
val userId = inputData.getString(KEY_USER_ID)
return eventsRepository
.getAllventsByUserId(userId)
.flattenAsObservable {
Log.d(TAG, it.size.toString())
it
}
.concatMapSingle {
val event = it
val mapper = ObjectMapper()
val typeRef: TypeReference<HashMap<String, Any>> = object : TypeReference<HashMap<String, Any>>() {}
val map: Map<String, Any> = mapper.readValue(Event.data, typeRef)
reportingApi.reportEvent(e.eventventType.getValue(), event.id,
event.eventCreateDate, event.bId, event.bHash,
map)
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.doOnSuccess {
deleteEvent(event)
}
.doOnError {
}
}
.toList()
//.subscribeOn(Schedulers.io())
.map { Result.retry() }
.onErrorReturn {
Result.retry()
}
}
private fun deleteEvent(event: Event) {
Single.fromCallable { eventRepository.deleteEvent(event) }
.subscribeOn(Schedulers.io())
.subscribe()
}
}
有什么办法可以正确地实现立即取消?
解决方案
推荐阅读
- splunk - 如何使用 REX 命令提取 splunk 中的多个字段?
- c# - 如何在 C# 中或使用 Windows 命令终止 RabbitMQ 连接?
- javascript - TypeError:无法读取未定义的属性“rtl”
- c - 计数直到某个数字向下并通过递归备份
- javascript - 数据库写入的块序列化
- facebook-ads-api - 我们如何使用 Python SDK 访问 Facebook Marketing API 中的 Ads Action Stats 列表?
- c# - 无法加载文件或程序集 'Microsoft.Xrm.Sdk,版本 = 9.0.0.0
- r - 如何将相关检验的 p 值和 lm 的 R² 添加到散点图?
- reactjs - 从 /src 导入反应模块而不是 node_modules
- sql - 更换托架空间