如何使postdelayed handler与实时匹配?

问题描述 投票:0回答:1

我设置了进度条最大值=30000,延迟时间100毫秒,播放30秒,所以当我尝试时,最终时间超过了30秒。当我把延迟时间设置为1000ms时,结果是正确的,但当我把时间设置为100ms时,我得到了34~35秒,超过了30秒。但当我设置为100毫秒时,我得到了34~35秒,超过了我想要的30秒。请问使用延迟时间100ms时,如何精确到30秒?

    private val delayChangeProgress = 100L

        binding.recordStartButton.setOnClickListener {
            onRecord(true)
            binding.recordStartButton.visibility = View.GONE
            binding.recordStopButton.visibility = View.VISIBLE
            recordChangeHandler.postDelayed(updateRecordProgressTask,delayChangeProgress)
            showLog("onChangeRecordPregressBar StartTime: "+ getRecordDateFormat(mContext).format(Date(System.currentTimeMillis())))
        }

    private val updateRecordProgressTask: Runnable = object : Runnable {
        override fun run() {
            if(recorder!=null) {
                onChangeRecordPregressBar()
                recordChangeHandler.postDelayed(this, delayChangeProgress)
            }
        }
    }

    private fun onChangeRecordPregressBar(){
        binding.audioStartProgressBar.max = 30000
        showLog("onChangeRecordPregressBar : "+binding.audioStartProgressBar.progress)
        binding.audioStartProgressBar.progress += delayChangeProgress.toInt()
        if(binding.audioStartProgressBar.max == binding.audioStartProgressBar.progress){
            stopRecording()
            binding.audioStartProgressBar.progress=0
            recordChangeHandler.removeCallbacks(updateRecordProgressTask)
            showLog("onChangeRecordPregressBar EndTime: "+ getRecordDateFormat(mContext).format(Date(System.currentTimeMillis())))
        }
    }

使用1000ms延迟时间时的日志

onChangeRecordPregressBar StartTime: 46:09
D/TAG: onChangeRecordPregressBar : 0
D/TAG: onChangeRecordPregressBar : 1000
...
D/TAG: onChangeRecordPregressBar : 28000
D/TAG: onChangeRecordPregressBar : 29000
D/TAG: onChangeRecordPregressBar EndTime: 46:39

使用100ms延迟时间时的日志

onChangeRecordPregressBar StartTime: 51:55
D/TAG: onChangeRecordPregressBar : 0
D/TAG: onChangeRecordPregressBar : 100
D/TAG: onChangeRecordPregressBar : 200
...
D/TAG: onChangeRecordPregressBar : 29800
D/TAG: onChangeRecordPregressBar : 29900
D/TAG: onChangeRecordPregressBar EndTime: 52:28
android android-handler
1个回答
0
投票

事实上,你不应该依赖你把时间放在 postDelayed 来更新进度。它并不是完全按照你设置的100或1000ms来执行的。当你初始化处理程序时,你的处理程序使用相同的程序来执行。MessageQueueMainThread因此,它取决于任务或消息的数量,所以你已经设置的时间可以增加。

你应该使用变量来节省时间来记录开始的例子。startTime 而当你打电话 onChangeRecordPregressBar 你应该计算持续时间。试试这个

private val delayChangeProgress = 100L
private var startTime = 0L

        binding.recordStartButton.setOnClickListener {
            startTime = System.currentTimeMillis()
            onRecord(true)
            binding.recordStartButton.visibility = View.GONE
            binding.recordStopButton.visibility = View.VISIBLE
            recordChangeHandler.postDelayed(updateRecordProgressTask,delayChangeProgress)
            showLog("onChangeRecordPregressBar StartTime: "+ getRecordDateFormat(mContext).format(Date(System.currentTimeMillis())))
        }

    private val updateRecordProgressTask: Runnable = object : Runnable {
        override fun run() {
            if(recorder!=null) {
                onChangeRecordPregressBar()
                recordChangeHandler.postDelayed(this, delayChangeProgress)
            }
        }
    }

    private fun onChangeRecordPregressBar(){
        binding.audioStartProgressBar.max = 30000
        showLog("onChangeRecordPregressBar : "+binding.audioStartProgressBar.progress)
        binding.audioStartProgressBar.progress = System.currentTimeMillis() - startTime
        if(binding.audioStartProgressBar.max == binding.audioStartProgressBar.progress){
            stopRecording()
            binding.audioStartProgressBar.progress=0
            recordChangeHandler.removeCallbacks(updateRecordProgressTask)
            showLog("onChangeRecordPregressBar EndTime: "+ getRecordDateFormat(mContext).format(Date(System.currentTimeMillis())))
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.