Exoplayer 清除除正在播放的媒体项目之外的所有媒体项目
Exoplayer Clear All MediaItems except the one that's playing
我正在使用参考this文章的简单方便的方法在exoplayer上制作动态播放列表。
我想清除除当前正在播放的媒体项目之外的所有媒体项目。
我的代码:
private fun clearExoplayer() {
val queueSize = exoPlayer.mediaItemCount
Timber.i("clearing items here quesize $queueSize")
for (i in 0..queueSize) {
if (i != exoPlayer.currentWindowIndex) {
exoPlayer.removeMediaItem(i)
}
}
}
但是我遇到了无法解决的错误。
java.lang.IllegalArgumentException
at com.google.android.exoplayer2.util.Assertions.checkArgument(Assertions.java:41)
at com.google.android.exoplayer2.ExoPlayerImpl.removeMediaItemsInternal(ExoPlayerImpl.java:1221)
at com.google.android.exoplayer2.ExoPlayerImpl.removeMediaItems(ExoPlayerImpl.java:460)
at com.google.android.exoplayer2.BasePlayer.removeMediaItem(BasePlayer.java:71)
at com.google.android.exoplayer2.SimpleExoPlayer.removeMediaItem(SimpleExoPlayer.java:1443)
at in_.co.innerpeacetech.music.exoplayer.BKMediaManager.clearExoplayer(BKMediaManager.kt:315)
可能是什么问题??
我不熟悉 Exoplayer 如何管理这个队列,但每当我看到一个循环试图遍历一个列表并更改该列表的内容时,它都是可疑的。基本上,您正在删除与您从中获得原始大小并存储在变量 'queueSize' 中的列表中的一个项目。第一次删除列表中的项目时,队列不再是 queueSize,对吧?那么你最终不会使用 'i' 来引用一个不再存在的位置吗?
我认为您需要跟踪队列中的哪一项是您要保留的项,然后在删除项时“跳过它”。所以会有三个步骤:
- 找出您要保留的项目在队列中的位置。
- 删除该项目之前的所有项目
- 删除该项目之后的所有项目
与此伪代码类似的内容:
// Find my item
int myItemOriginalIndex = -1;
for ( int x = 0; x < myList.size(); x++ ) {
if ( MATCHING CONDITION TEST HERE ) {
myItemOriginalIndex = x;
break;
}
}
// Delete up to my item - notice I am always deleting at position "0"
// since presumably the list structure changes as I delete it
if ( myItemOriginalIndex > 0 ) {
// This means the one I want to keep isn't the first one
for ( int x = 0; x < myItemOriginalIndex; x++ {
myList.remove(0);
}
}
// Now the one I want to keep is the first one, delete the rest
// Notice we start with item 1, not item 0 since we want to keep that one!
for ( int x = 1; x < myList.size(); x++ ) {
myList.remove(1);
}
关键是当你修改列表本身时,技术是随着列表的缩小从相同的位置继续删除。
试试这个
private fun clearExoplayer() {
val queueSize = exoPlayer.mediaItemCount
Timber.i("clearing items here quesize $queueSize")
for (i in queueSize downTo 0) {
if (i != exoPlayer.currentWindowIndex) {
exoPlayer.removeMediaItem(i)
}
}
}
我正在使用参考this文章的简单方便的方法在exoplayer上制作动态播放列表。 我想清除除当前正在播放的媒体项目之外的所有媒体项目。
我的代码:
private fun clearExoplayer() {
val queueSize = exoPlayer.mediaItemCount
Timber.i("clearing items here quesize $queueSize")
for (i in 0..queueSize) {
if (i != exoPlayer.currentWindowIndex) {
exoPlayer.removeMediaItem(i)
}
}
}
但是我遇到了无法解决的错误。
java.lang.IllegalArgumentException
at com.google.android.exoplayer2.util.Assertions.checkArgument(Assertions.java:41)
at com.google.android.exoplayer2.ExoPlayerImpl.removeMediaItemsInternal(ExoPlayerImpl.java:1221)
at com.google.android.exoplayer2.ExoPlayerImpl.removeMediaItems(ExoPlayerImpl.java:460)
at com.google.android.exoplayer2.BasePlayer.removeMediaItem(BasePlayer.java:71)
at com.google.android.exoplayer2.SimpleExoPlayer.removeMediaItem(SimpleExoPlayer.java:1443)
at in_.co.innerpeacetech.music.exoplayer.BKMediaManager.clearExoplayer(BKMediaManager.kt:315)
可能是什么问题??
我不熟悉 Exoplayer 如何管理这个队列,但每当我看到一个循环试图遍历一个列表并更改该列表的内容时,它都是可疑的。基本上,您正在删除与您从中获得原始大小并存储在变量 'queueSize' 中的列表中的一个项目。第一次删除列表中的项目时,队列不再是 queueSize,对吧?那么你最终不会使用 'i' 来引用一个不再存在的位置吗?
我认为您需要跟踪队列中的哪一项是您要保留的项,然后在删除项时“跳过它”。所以会有三个步骤:
- 找出您要保留的项目在队列中的位置。
- 删除该项目之前的所有项目
- 删除该项目之后的所有项目
与此伪代码类似的内容:
// Find my item
int myItemOriginalIndex = -1;
for ( int x = 0; x < myList.size(); x++ ) {
if ( MATCHING CONDITION TEST HERE ) {
myItemOriginalIndex = x;
break;
}
}
// Delete up to my item - notice I am always deleting at position "0"
// since presumably the list structure changes as I delete it
if ( myItemOriginalIndex > 0 ) {
// This means the one I want to keep isn't the first one
for ( int x = 0; x < myItemOriginalIndex; x++ {
myList.remove(0);
}
}
// Now the one I want to keep is the first one, delete the rest
// Notice we start with item 1, not item 0 since we want to keep that one!
for ( int x = 1; x < myList.size(); x++ ) {
myList.remove(1);
}
关键是当你修改列表本身时,技术是随着列表的缩小从相同的位置继续删除。
试试这个
private fun clearExoplayer() {
val queueSize = exoPlayer.mediaItemCount
Timber.i("clearing items here quesize $queueSize")
for (i in queueSize downTo 0) {
if (i != exoPlayer.currentWindowIndex) {
exoPlayer.removeMediaItem(i)
}
}
}