代码之家  ›  专栏  ›  技术社区  ›  CL So

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

  •  0
  • CL So  · 技术社区  · 6 年前

    但是如果我在其他线程中捕获值,我不知道这些值是否正确。e、 g.x是最后一个值,y和z是上一个值

    所以我写这个程序来测试,如果值是错的, Log.v("abc not equal", "a:$a b:$b c:$c") 将被调用

    但结果没有问题,a b c总是相等的

    我应该相信这个结果吗?为什么a b c永远不会不同(e、 g.a:10 b:9 c:9),手在等吗?

    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 回复  |  直到 6 年前
        1
  •  1
  •   emandt    6 年前

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