0

我正在创建一个用于跌倒检测的应用程序,并且我正在尝试实现 RxKotlin 来做到这一点。为了提供良好的数据处理,我每 250 毫秒获取一次 sesnorEvent 并将其放入缓冲区(最后 10 秒)。不幸的是,当我移动手机时,缓冲区中的全部数据都是同一个事件。是我的代码中的问题还是它只是这样工作?

我已经尝试使用窗口和缓冲区,但是结果是一样的。应用的目标 API 为 28,最小 API 21。 SensorListener 放置在前台服务中

//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
    }



我希望 observable 的输出类似于 [11.234473, 9.768473, 13.23543],但是,我得到 [9.768473, 9.768473, 9.768473]。要点是,在缓冲区生命周期内移动手机后,缓冲区中的值应该不同,但事实并非如此。

4

1 回答 1

1

尝试添加return@map您的地图 lambdas (ie, .map { return@map proxy.value }) 。此外,您可以直接订阅proxyBehaviorSubject 以跟踪传感器的变化。您可以使用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())
            }
}
于 2019-12-12T04:56:56.363 回答