如何在WorkManager中配置Rx?

Igo*_*dro 5 android alarmmanager intentservice rx-android android-workmanager

AlarmManager当用户向任务添加截止日期时,我实现了发送通知的功能。但是,当用户关闭设备时,所有警报都将丢失。现在,我正在更新,BroadcastReceiver以接收android.intent.action.BOOT_COMPLETED和重新设置为每个任务设置的所有警报。

我的第一个尝试是将Rx Single所有任务的到期日都高于当前时间BroadcastReceiver,然后重新计划所有警报。问题是Observable一旦BroadcastReceiver没有生命周期,我将无法处置。同样,这似乎不是一个好方法

在我的研究期间,IntentService对于这种情况,这是一个很好的解决方案,但是我进入了新WorkManager库,并且OneTimeWorkRequest看起来像是一个很好且简单的解决方案。

Worker被调用和执行正确,但我不能够处理的Observable,因为该onStopped方法不会被调用。

这是基于此代码段的实现

class TaskAlarmWorker(context: Context, params: WorkerParameters) :
    Worker(context, params), KoinComponent {

    private val daoRepository: DaoRepository by inject()

    private val compositeDisposable = CompositeDisposable()

    override fun doWork(): Result {
        Timber.d("doWork")

        val result = LinkedBlockingQueue<Result>()

        val disposable =
            daoRepository.getTaskDao().getAllTasks().applySchedulers().subscribe(
            { result.put(Result.SUCCESS) },
            { result.put(Result.FAILURE) }
        )

        compositeDisposable.add(disposable)

        return try {
            result.take()
        } catch (e: InterruptedException) {
            Result.RETRY
        }
    }

    override fun onStopped(cancelled: Boolean) {
        Timber.d("onStopped")
        compositeDisposable.clear()
    }
}
Run Code Online (Sandbox Code Playgroud)
  • 这是WorkManager一个好的解决方案吗?
  • 是否可以Observable正确处理?

sma*_*871 5

    \n
  • 是的WorkManager,这是一个很好的解决方案(甚至可能是最好的解决方案)
  • \n
  • 您应该使用RxWorker而不是Worker. 这是一个例子:

    \n\n
      \n
    1. 去实施它。将androidx.work:work-rxjava2:$work_version添加到您的build.gradle文件作为依赖项。

    2. \n
    3. 从类扩展你的类RxWorker,然后覆盖createWork()函数。

    4. \n
  • \n
\n\n
class TaskAlarmWorker(context: Context, params: WorkerParameters) :\n    RxWorker(context, params), KoinComponent {\n\n    private val daoRepository: DaoRepository by inject()  \n\n    override fun createWork(): Single<Result> {\n        Timber.d("doRxWork")\n\n     return daoRepository.getTaskDao().getAllTasks()\n                .doOnSuccess { /* process result somehow */ }\n                .map { Result.success() }\n                .onErrorReturn { Result.failure() }          \n\n    }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

关于 RxWorker 的重要说明

\n\n
    \n
  • createWork() 方法在主线程上调用,但返回的 single 是在后台线程上订阅的。
  • \n
  • 你不需要担心观察者的处置,因为 RxWorker 会在工作停止时自动处置它。
  • \n
  • 返回带有 Result.failure() 值的 Single 和带有错误的 single 都会导致工作线程进入失败状态。
  • \n
  • 您可以覆盖onStopped函数来执行更多操作。
  • \n
\n
\n\n

阅读更多 :

\n\n\n