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正确处理?WorkManager,这是一个很好的解决方案(甚至可能是最好的解决方案)您应该使用RxWorker而不是Worker. 这是一个例子:
去实施它。将androidx.work:work-rxjava2:$work_version添加到您的build.gradle文件作为依赖项。
从类扩展你的类RxWorker,然后覆盖createWork()函数。
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}\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\n关于 RxWorker 的重要说明:
\n\n\n
\n- createWork() 方法在主线程上调用,但返回的 single 是在后台线程上订阅的。
\n- 你不需要担心观察者的处置,因为 RxWorker 会在工作停止时自动处置它。
\n- 返回带有 Result.failure() 值的 Single 和带有错误的 single 都会导致工作线程进入失败状态。
\n- 您可以覆盖
\nonStopped函数来执行更多操作。
阅读更多 :
\n\n\n| 归档时间: |
|
| 查看次数: |
550 次 |
| 最近记录: |