我设置了进度条最大值=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
事实上,你不应该依赖你把时间放在 postDelayed
来更新进度。它并不是完全按照你设置的100或1000ms来执行的。当你初始化处理程序时,你的处理程序使用相同的程序来执行。MessageQueue
与 MainThread
因此,它取决于任务或消息的数量,所以你已经设置的时间可以增加。
你应该使用变量来节省时间来记录开始的例子。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())))
}
}