可观察到的相同值的返回列表
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了可观察到的相同值的返回列表相关的知识,希望对你有一定的参考价值。
我正在创建一个用于跌倒检测的应用程序,我正在尝试实现RxKotlin。为了提供良好的数据处理,我每隔250ms进行一次sesnorEvent并将其放入缓冲区(持续10秒)。不幸的是,移动手机时,缓冲区中的所有数据都是同一事件。是我的代码中的问题还是这样工作?
我已经尝试使用窗口和缓冲区,但是结果是相同的。该应用程序的目标API是28,最小API21。SensorListener放置在前台Service
//initialization of the properties
private val proxy: BehaviorSubject<SensorEvent> = BehaviorSubject.create()
private var mSensorManager: SensorManager? = null
private var mAccelerometer: Sensor? = null
private lateinit var subscribe: Disposable
override fun onCreate()
super.onCreate()
mSensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
mAccelerometer = mSensorManager!!.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
mSensorManager!!.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL)
subscribe = Observable.interval(250, TimeUnit.MILLISECONDS)
.map proxy.value
.buffer(1, TimeUnit.SECONDS)
.map
it.map sensorEvent -> calculateAcceleration(sensorEvent!!)
.subscribe
Log.d("MySensor", it.toString())
//Here I call onNext also log data for every called event
override fun onSensorChanged(event: SensorEvent?)
proxy.onNext(event!!)
Log.d("MySensor", calculateAcceleration(event).toString())
private fun calculateAcceleration(event: SensorEvent): Float
val axisX = event.values[0]
val axisY = event.values[1]
val axisZ = event.values[2]
val acceleration = sqrt(axisX.pow(2) + axisY.pow(2) + axisZ.pow(2))
//Log.d("MyDataSave", acceleration.toString())
return acceleration
[我希望可观察到的输出类似于[11.234473、9.77683、13.23543],但是,我得到的是[9.768473、9.77683、9.776873]。要点是,在缓冲区寿命期间移动手机后,缓冲区中的值应该不同,但是没有差别。
答案
尝试在地图lambda中添加return@map
(即.map return@map proxy.value
)。另外,您可以直接订阅proxy
BehaviorSubject以跟踪传感器中的更改。您可以使用debounce
来“延迟”排放。因此您的代码将是:
override fun onCreate()
super.onCreate()
mSensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
mAccelerometer = mSensorManager!!.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
mSensorManager!!.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL)
proxy.debounce(250, TimeUnit.MILLISECONDS)
.subscribe
Log.d("MySensor", it.toString())
以上是关于可观察到的相同值的返回列表的主要内容,如果未能解决你的问题,请参考以下文章