Android Exoplayer清除除';在玩什么

Android Exoplayer清除除';在玩什么,android,exoplayer2.x,Android,Exoplayer2.x,我正在使用参考文章的简单方便的方法在exoplayer上制作动态播放列表。 我想清除除当前正在播放的媒体项之外的所有媒体项 我的代码: private fun clearExoplayer() { val queueSize = exoPlayer.mediaItemCount Timber.i("clearing items here quesize $queueSize") for (i in 0..queueSize) {

我正在使用参考文章的简单方便的方法在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);
    }
    
    //查找我的项目
    int myItemOriginalIndex=-1;
    对于(int x=0;x0){
    //这意味着我想要保留的不是第一个
    对于(int x=0;x
    关键是,当您修改列表本身时,技巧是在列表缩小时继续从同一位置删除

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

    没有。我更新了我对列表使用的一些伪代码的答案。不确定Exo队列下面的结构是什么,你必须玩它并找出答案。感谢你的洞察力…你建议我怎么做?伙计,这似乎很有希望。我已经离开房间睡觉了。我一定会在早上第一件事尝试。没有p问题!我有一个后续问题要问你,但与你的帖子无关,我们可以开始聊天吗?当然。。。。。。。。。。。。