可观察到的相同值的返回列表

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())
            

以上是关于可观察到的相同值的返回列表的主要内容,如果未能解决你的问题,请参考以下文章

WPF ListView - 2 个维度,1 个相同的结构

如何使用MySQL查询某个列中相同值的数量统计

显示 MySQL 中包含相同值的所有行

无法在网络调用中返回可观察到的 customError

C# 调用具有不同类型的相同扩展函​​数作为参数(可能是委托?)

管道操作符时如何返回可观察到的`forkJoin`