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' 来引用一个不再存在的位置吗?

我认为您需要跟踪队列中的哪一项是您要保留的项,然后在删除项时“跳过它”。所以会有三个步骤:

  1. 找出您要保留的项目在队列中的位置。
  2. 删除该项目之前的所有项目
  3. 删除该项目之后的所有项目

与此伪代码类似的内容:

// 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)
        }
    }


}