在 IntentService (WakefulIntentService) 中延迟(定时)注销传感器侦听器
Delayed (timed) unregister sensor listener inside IntentService (WakefulIntentService)
我已经实现了 IntentService
,它使用 SensorManager
从心率传感器读取数据。
使用 AlarmManager
和 WakefulBroadcastReceiver
定期调用它,然后在 onSensorChanged
时,它使用健身历史更新 Google 健身数据 API ,使用 onSensorChanged 调用的时间作为时间戳。
当然,IntentService
实现了一个 SensorEventListener
,它是使用 CommonsWare cwac-wakeful 作为一个 WakefulIntentService
实现的。
发生的事情是传感器读取任务需要非常多变的时间,有时,onSensorChanged
——我想一旦注册了传感器侦听器,它就会异步工作——甚至在几分钟后被调用,当 IntentService
注册传感器侦听器的实例已经结束,侦听器侦听 (!) 是连续的。
这转化为一系列数据读数重叠并被插入到 Google Fit 中,相对于 IntentService
测量任务的原始定时调用没有任何时间顺序。
此外,此行为还会导致电池使用异常,因为心率传感器使用了几个非常亮的 LED,并且 - 除非未注册 - 一直保持活动状态,直到我猜它的硬件超时。
我试图通过在特定超时(30 秒)后调用 post 延迟 Runnable
来注销 IntentService
中的传感器侦听器,但它不起作用。
我的问题是:
有没有办法在 IntentService
或 WakefulIntentService
中在一定延迟后调用传感器 unregisterListener
同时防止线程结束?或者以某种方式清除 onSensorChanged 队列?
或者:有没有办法在传感器侦听器注册时为其分配唯一 ID?这样,在 onSensorChanged
内,可以将事件与其原始 IntentService
调用时间进行匹配,并且可以 - 至少 - 可以将读数插入 Google 适合正确的时间顺序。
提前致谢。
I've implemented an IntentService which, using SensorManager, reads data from a heart rate sensor.
恕我直言,这不是 IntentService
的正确用法。恕我直言,IntentService
是为工作的交易位设计的:磁盘 I/O、数据库 I/O、Web 服务调用等。它不是为无限期工作设计的。
The IntentService, of course, implements a SensorEventListener and it's implemented as a WakefulIntentService using CommonsWare cwac-wakeful.
WakefulIntentService
不是 为无限期工作而设计的。
What's happening is that sensor reading task takes a very highly variable time and sometimes, onSensorChanged - which I guess works asynchronously once the sensor listener is registered - gets called even minutes later, when the IntentService instance which registered the sensor listener, has already ended and the listener listening (!) is a successive one.
一般来说,无法保证您会获得任何传感器读数,因为一旦服务被销毁,您的进程可能随时终止。
Is there a way, inside an IntentService or a WakefulIntentService to call the sensor unregisterListener after a certain delay preventing the thread to end, meanwhile?
没有任何可靠的方式。
去掉 WakefulIntentService
。使用常规 Service
。注册传感器事件。当您获得所需的事件时,取消注册传感器侦听器和 stopSelf()
服务。一路走来,管理你自己的 WakeLock
.
Or to clear the onSensorChanged queue somehow?
我不知道。
Is there a way to assign an univoque ID to a sensor listener at the moment of its registration?
侦听器对象已经是唯一的。为什么 ID 会使它更独特?
也就是说,欢迎您在侦听器对象中放置一个字段,该字段具有您喜欢的任何类型的唯一值。
我已经实现了 IntentService
,它使用 SensorManager
从心率传感器读取数据。
使用 AlarmManager
和 WakefulBroadcastReceiver
定期调用它,然后在 onSensorChanged
时,它使用健身历史更新 Google 健身数据 API ,使用 onSensorChanged 调用的时间作为时间戳。
当然,IntentService
实现了一个 SensorEventListener
,它是使用 CommonsWare cwac-wakeful 作为一个 WakefulIntentService
实现的。
发生的事情是传感器读取任务需要非常多变的时间,有时,onSensorChanged
——我想一旦注册了传感器侦听器,它就会异步工作——甚至在几分钟后被调用,当 IntentService
注册传感器侦听器的实例已经结束,侦听器侦听 (!) 是连续的。
这转化为一系列数据读数重叠并被插入到 Google Fit 中,相对于 IntentService
测量任务的原始定时调用没有任何时间顺序。
此外,此行为还会导致电池使用异常,因为心率传感器使用了几个非常亮的 LED,并且 - 除非未注册 - 一直保持活动状态,直到我猜它的硬件超时。
我试图通过在特定超时(30 秒)后调用 post 延迟 Runnable
来注销 IntentService
中的传感器侦听器,但它不起作用。
我的问题是:
有没有办法在 IntentService
或 WakefulIntentService
中在一定延迟后调用传感器 unregisterListener
同时防止线程结束?或者以某种方式清除 onSensorChanged 队列?
或者:有没有办法在传感器侦听器注册时为其分配唯一 ID?这样,在 onSensorChanged
内,可以将事件与其原始 IntentService
调用时间进行匹配,并且可以 - 至少 - 可以将读数插入 Google 适合正确的时间顺序。
提前致谢。
I've implemented an IntentService which, using SensorManager, reads data from a heart rate sensor.
恕我直言,这不是 IntentService
的正确用法。恕我直言,IntentService
是为工作的交易位设计的:磁盘 I/O、数据库 I/O、Web 服务调用等。它不是为无限期工作设计的。
The IntentService, of course, implements a SensorEventListener and it's implemented as a WakefulIntentService using CommonsWare cwac-wakeful.
WakefulIntentService
不是 为无限期工作而设计的。
What's happening is that sensor reading task takes a very highly variable time and sometimes, onSensorChanged - which I guess works asynchronously once the sensor listener is registered - gets called even minutes later, when the IntentService instance which registered the sensor listener, has already ended and the listener listening (!) is a successive one.
一般来说,无法保证您会获得任何传感器读数,因为一旦服务被销毁,您的进程可能随时终止。
Is there a way, inside an IntentService or a WakefulIntentService to call the sensor unregisterListener after a certain delay preventing the thread to end, meanwhile?
没有任何可靠的方式。
去掉 WakefulIntentService
。使用常规 Service
。注册传感器事件。当您获得所需的事件时,取消注册传感器侦听器和 stopSelf()
服务。一路走来,管理你自己的 WakeLock
.
Or to clear the onSensorChanged queue somehow?
我不知道。
Is there a way to assign an univoque ID to a sensor listener at the moment of its registration?
侦听器对象已经是唯一的。为什么 ID 会使它更独特?
也就是说,欢迎您在侦听器对象中放置一个字段,该字段具有您喜欢的任何类型的唯一值。