Exoplayer Очистить все медиаэлементы, кроме воспроизводимого

Я работаю над созданием динамического списка воспроизведения на 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)

В чем может быть проблема ??


person Pemba Tamang    schedule 03.05.2021    source источник


Ответы (2)


Я не знаком с тем, как 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);
}

Дело в том, что когда вы изменяете сам список, методика состоит в том, чтобы продолжить удаление с той же позиции, поскольку список сжимается.

person tfrysinger    schedule 03.05.2021
comment
спасибо за понимание ... как вы предлагаете мне это сделать? - person Pemba Tamang; 03.05.2021
comment
это кажется многообещающим. Я вышел из комнаты и пошел спать ... Я обязательно попробую это утром первым делом. - person Pemba Tamang; 03.05.2021
comment
Без проблем! У меня есть к вам дополнительный вопрос, но не связанный с вашим сообщением, можем ли мы перейти в чат? - person tfrysinger; 04.05.2021
comment
Конечно............ - person Pemba Tamang; 04.05.2021

Попробуй это

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


}
person Jaswant Singh    schedule 03.05.2021
comment
нет, не сработало - person Pemba Tamang; 03.05.2021
comment
Я обновил свой ответ на некоторый псевдокод, который использую со списками. Не уверены, что за структура находится под очередью Exo, вам придется поиграть с ней и выяснить. - person tfrysinger; 03.05.2021