所以我每30秒在应用程序后台运行一次RxJava计时器。问题是,即使应用在后台运行,此计时器也会运行。我担心的是AndroidOS最终是否会杀死该应用程序,即使此计时器正在运行。我希望操作系统理想地杀死应用程序,而不是由于这个计时器而被迫保持活力。计时器在应用关闭时释放。
我正在考虑一种解决方案,我可以将此可观察量的生命周期绑定到前台/后台的应用程序。这样,它就会适当地暂停/重新启动。现在它运行直到应用程序被杀死。以下是我设置计时器的方法:
navBadgeTimerDisposable = Observable.timer(refetchIntervalMs, TimeUnit.MILLISECONDS)
.flatMap {
fetchNavBadges(BADGES_TO_FETCH).toObservable()
}
.subscribe({
Timber.i("android_fetch_badge_success")
navBadge.onNext(it)
loadNavBadges(it.refetchIntervalMs)
}, {
if (MAX_RETRIES > 0) {
Timber.w(it, "android_fetch_badge_retry")
MAX_RETRIES -= 1
loadNavBadges(DEFAULT_RETRY_INTERVAL)
} else {
Timber.w(it, "android_fetch_badge_failure")
}
})
操作系统理想地杀死应用程序,而不是由于这个计时器而被迫让它保持活力。
这不是Android的运作方式。Android有一个非常复杂的算法,以确定应用程序何时会被杀死。在大多数情况下,它会杀死应用程序,因为它必须释放资源(内存不足(
有关更多信息,请查看以下资源:
- Android低内存杀手和应用程序后退堆栈
- https://developer.android.com/guide/components/activities/process-lifecycle
我正在考虑一种解决方案,我可以将此可观察量的生命周期绑定到前台/后台的应用程序。这样,它就会适当地暂停/重新启动。
如果在应用在后台运行时不需要计时器,则只需在生命周期回调中释放订阅即可。
有一些生命周期回调,当系统检测到内存不足状态时,将调用这些回调。欲了解更多信息,请查看:https://developer.android.com/topic/performance/memory