我正在使用Exoplayer播放播放列表中的视频。当当前视频结束时,我想自动播放下一个视频。为此,我向我的播放器添加了一个EventListener。这里有一个片段:
private val videoPlayerListener = object: Player.EventListener {
override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) {
when(playbackState) {
Player.STATE_IDLE -> showLoadingView()
Player.STATE_READY -> hideLoadingView()
Player.STATE_BUFFERING -> showVideoProgressWheel()
Player.STATE_ENDED -> {
Log.d(TAG, "fired")
playNextVideo()
}
}
}
override fun onPlayerError(error: ExoPlaybackException?) {
// handle error event
}
}这种方法的问题是,我的日志显示Player.STATE_ENDED会触发两次。这的连锁效应是我的播放列表是从
视频1 ->视频3 ->视频5 ->视频7
而不是
视频1 ->视频2 ->视频3 ->视频4
我做了一些研究,发现了本期。我检查了我的代码,并意识到我实际上是在调用一个方法,其中包含了addListener(videoPlayerListener)中的OnCreate()、OnStart()、OnPause()、OnResume()和OnStop()。为了解决这个问题,我在addListener行之前添加了以下内容:
try {
player.removeListener(videoPlayerListener)
Log.d(TAG, "Listener temporarily deleted")
}
catch (e: Exception) {}请注意,我的代码中只有一个函数包含addListener(...),我将removeListener()调用直接放在addListener()行前面。尽管如此,每次视频结束时,Player.STATE_ENDED仍会接到两次电话。
我做什么好?
发布于 2020-06-18 10:30:29
使用此代码
接受这样一个全局变量,
var isVideoEnded=false然后在你的听众中做这件事
private val videoPlayerListener = object: Player.EventListener {
override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) {
when(playbackState) {
Player.STATE_IDLE -> showLoadingView()
Player.STATE_READY -> {
hideLoadingView()
isVideoEnded=false
}
Player.STATE_BUFFERING -> showVideoProgressWheel()
Player.STATE_ENDED -> {
if(!isVideoEnded){
playNextVideo()
isVideoEnded=true
}
Log.d(TAG, "fired")
}
}
}
override fun onPlayerError(error: ExoPlaybackException?) {
// handle error event
}
}https://stackoverflow.com/questions/62447467
复制相似问题