首页 > 解决方案 > 如何使 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()
    }
}

有什么办法可以正确地实现立即取消?

标签: android-workmanager

解决方案


推荐阅读