В Kotlin будет ли поток обработчика ждать завершения другого потока? - PullRequest
0 голосов
/ 10 октября 2018

Я хочу записывать значение датчика через каждые 5 мс

Но я не знаю, верны ли значения, если я фиксирую значения в другом потоке.например, x - это последнее значение, а y и z - предыдущее значение

Поэтому я пишу эту программу для проверки, если значение неверно, Log.v("abc not equal", "a:$a b:$b c:$c") будет называться

Но результат не представляет проблемы, abc всегда равны

Стоит ли доверять этому результату?Почему abc никогда не будет другим?(например, a: 10 b: 9 c: 9), Хандер ждет завершения 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 голосов
/ 10 октября 2018

Метод registerListener () имеет дополнительный параметр, определяющий используемый обработчик.Вы не используете этот дополнительный параметр, поэтому слушатель будет запускать все свои методы обратного вызова ("onSensorChanged ()" и т. Д.) В MainThread / UiThread.Даже ваша переменная «обработчик» (и объект Runnable) работает в Main / UiThread, поэтому проблем нет.Проблемы могут возникнуть, если в вашем методе registerListener () ИЛИ И И в переменной «handler» используются разные потоки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...