我想每5ms记录一次传感器值
但是如果我在其他线程中捕获值,我不知道这些值是否正确。例如x是最后一个值,y和z是先前的值
所以我编写了此程序进行测试,如果值错误,将调用Log.v("abc not equal", "a:$a b:$b c:$c")
但是结果没问题,a b c总是相等
我应该相信这个结果吗?为什么a b c永远不会不同? (例如a:10 b:9 c:9),Hander等待SensorEventListener完成吗?
class MainActivity : AppCompatActivity() {
var a=0
var b=0
var c=0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
val sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
sensorManager.registerListener(sensorListener, sensor, SensorManager.SENSOR_DELAY_NORMAL)
val handler = Handler()
val run = object : Runnable{
override fun run() {
if(!(a == b && b == c)){
Log.v("abc not equal", "a:$a b:$b c:$c")
}
handler.postDelayed(this,5)
}
}
handler.postDelayed(run,5)
}
private val sensorListener = object: SensorEventListener {
override fun onAccuracyChanged(p0: Sensor?, p1: Int) {}
override fun onSensorChanged(event: SensorEvent?) {
if(event != null){
val xRaw = event.values[0]
val yRaw = event.values[1]
val zRaw = event.values[2]
if(a>100){
a=0
b=0
c=0
}
a+=1
slow()
b+=1
slow()
c+=1
}
}
}
fun slow(){
var x = 0
while (x < 50000) {
x++
if(x>10) {
var y = Random().nextInt(x - 1)
}
}
}
}
答案 0 :(得分:1)
“ registerListener()”方法具有一个附加参数,该参数定义要使用的Handler。您没有使用该附加参数,因此侦听器将在MainThread / UiThread中运行其所有回调方法(“ onSensorChanged()”等)。甚至您的“处理程序”(和Runnable对象)变量都在Main / UiThread中运行,因此没有任何问题。如果您的“ registerListener()”方法或/和“处理程序”变量使用不同的线程,则可能会发生问题。