如何使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)
                        }
                    })

SendEventstWorker

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()
    }
}

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)