在Kotlin中,处理程序线程会等待另一个线程完成吗?

时间:2018-10-10 09:24:23

标签: android multithreading kotlin

我想每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)
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

“ registerListener()”方法具有一个附加参数,该参数定义要使用的Handler。您没有使用该附加参数,因此侦听器将在MainThread / UiThread中运行其所有回调方法(“ onSensorChanged()”等)。甚至您的“处理程序”(和Runnable对象)变量都在Main / UiThread中运行,因此没有任何问题。如果您的“ registerListener()”方法或/和“处理程序”变量使用不同的线程,则可能会发生问题。