【发布时间】:2018-10-15 23:26:49
【问题描述】:
我实现了AlarmManager,以便在用户向任务添加截止日期时发送通知。但是,当用户关闭设备时,所有警报都会丢失。现在我正在更新BroadcastReceiver 以接收android.intent.action.BOOT_COMPLETED 并重新安排为每个任务设置的所有警报。
我的第一次尝试是在BroadcastReceiver 中获取所有到期日期高于当前时间的任务的Rx Single,然后重新安排所有警报。问题是一旦BroadcastReceiver 没有生命周期,我就无法处置Observable。另外,it seems that this is not a good approach。
在我的研究中,IntentService 是这个案例的一个很好的解决方案,但我正在进入新的 WorkManager 库,OneTimeWorkRequest 看起来是一个很好且简单的解决方案。
Worker 正在被调用并正确执行,但我无法释放 Observable,因为从未调用过 onStopped 方法。
这是基于this snippet的实现:
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()
}
}
-
WorkManager是否适合这种情况? - 是否可以正确处理
Observable?
【问题讨论】:
标签: android alarmmanager rx-android intentservice android-workmanager