如何在音频播放器代码Kotlin中使用LifecycleScope/Coroutine而不是处理程序



我正在youtube上尝试如何在Kotlin中创建一个简单的音频播放器教程。在处理它的过程中,我发现构造函数Handler((已被弃用。我在谷歌上搜索了一些解决方案,似乎可以使用LifecycleScope/Coroutine。知道如何使用新的LifecycleScope/Coroutine更改以下代码吗?

class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private var mp: MediaPlayer? = null
private var currentSong = mutableListOf(R.raw.high_sky)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
controlSound(currentSong[0])
}
private fun controlSound(id: Int) {
binding.fabPlay.setOnClickListener{
if(mp == null){
mp = MediaPlayer.create(this,id)
Log .d("Mainactivity", "ID: ${mp!!.audioSessionId}")
initialiseSeekbar()
}
mp?.start()
Log .d("Mainactivity", "Duration: ${mp!!.duration/1000} seconds")
}
binding.fabPause.setOnClickListener{
if (mp !== null) mp?.pause()
Log .d("Mainactivity", "Paused at: ${mp!!.currentPosition/1000} seconds")
}
binding.fabStop.setOnClickListener{
if (mp!==null) {
mp?.stop()
mp?.reset()
mp?.release()
mp = null
}
}
binding.seekbar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener{
override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
if (fromUser) mp?.seekTo(progress)
}
override fun onStartTrackingTouch(seekBar: SeekBar?) {
}
override fun onStopTrackingTouch(seekBar: SeekBar?) {
}
})
}
private fun initialiseSeekbar(){
binding.seekbar.max = mp!!.duration
val handler = Handler()
handler.postDelayed(object: Runnable {
override fun run(){
try{
binding.seekbar.progress = mp!!.currentPosition
handler.postDelayed(this, 1000)
} catch (e: Exception) {
binding.seekbar.progress =0
}
}
}, 0)
}

}

从技术上讲,您仍然可以使用Handler:它只是不推荐使用的无参数构造函数。他们只是希望您指定一个Looper:

Handler(Looper.getMainLooper())

这将在没有任何警告的情况下发挥作用。

最新更新