Менеджер предварительной загрузки помогает улучшить взаимодействие с пользователями, предоставляя им контент быстрее и сокращая время ожидания при переключении между элементами. Он также позволяет настраивать продолжительность и порядок предварительной загрузки для каждого элемента.
В социальных сетях часто встречается ситуация, когда приложение показывает пользователю список или карусель с выбором медиафайлов. Например, приложение может показывать карусель коротких видеороликов. Когда одно видео заканчивается, приложение переключается на следующее. А если пользователю не нравится текущее видео, он может просто смахнуть его, чтобы перейти к следующему или предыдущему.
Если вы не загружаете видеоконтент заранее, это может привести к некомфортному пользовательскому опыту. Пользователь заканчивает просмотр одного медиафайла и вынужден ждать загрузки следующего.
С другой стороны, если вы предварительно загружаете контент слишком агрессивно, это приводит к трате электроэнергии и пропускной способности сети на загрузку контента, который пользователь, возможно, никогда не воспроизведет.
DefaultPreloadManager
помогает вашему приложению сбалансировать эти факторы. Менеджер предварительной загрузки взаимодействует с вашим приложением, чтобы определить важность каждого медиа-элемента и заранее загружает необходимое количество данных.
Разделение труда
Если вы используете DefaultPreloadManager
, часть работы выполняет ваш код, а часть — менеджер предварительной загрузки.
Ваше приложение должно выполнять следующие функции:
- Создайте объекты
ExoPlayer
приложения, используя тот же объектDefaultPreloadManager.Builder
, который вы использовали для создания менеджера предварительной загрузки. Для созданияExoPlayer
вызовите методDefaultPreloadManager.Builder.buildExoPlayer()
. - Сообщите менеджеру предварительной загрузки о каждом отслеживаемом медиа-элементе . Это может быть не весь контент карусели; вместо этого можно указать только первые несколько элементов, которые будут воспроизведены. По мере перемещения пользователя по карусели вы можете добавлять и удалять медиа-элементы из пула менеджера предварительной загрузки.
- Отменяйте приоритеты в менеджере предварительной загрузки при изменении содержимого карусели или при смене пользователем воспроизводимого элемента. Это заставит менеджер предварительной загрузки переопределить приоритет каждого медиаэлемента и загрузить контент при необходимости. Менеджер предварительной загрузки будет отменяться после первого добавления медиаэлементов, а также при переходе пользователя от одного элемента к другому, а также при добавлении или удалении элементов карусели.
- Отвечайте на запросы менеджера предварительной загрузки , сообщая ему, какой объем контента следует предварительно загрузить для каждого элемента.
Получайте медиафайлы из менеджера предварительной загрузки , когда пользователь начинает воспроизведение. Менеджер предварительной загрузки предоставляет вашему приложению
MediaSource
для этого контента.Когда закончите работу с менеджером предварительной загрузки, отпустите его, освободив тем самым его ресурсы.
Менеджер предварительной загрузки выполняет следующие действия:
- Он отслеживает все медиа-элементы, добавленные в него вашим приложением.
- Каждый раз, когда его приоритеты становятся недействительными, он обращается к вашему приложению, вызывая
TargetPreloadStatusControl
, реализованный в вашем приложении. Он вызывает этот метод, чтобы узнать, какой объём каждого медиа-элемента нужно загрузить. - После запроса к приложению оно предварительно загружает необходимое количество каждого медиафайла. Менеджер предварительной загрузки определяет порядок загрузки. Он отдаёт приоритет тем, которые расположены ближе всего к тому, который воспроизводит пользователь.
- Когда приложение запрашивает контент, менеджер предварительной загрузки предоставляет
MediaSource
с уже загруженным контентом.
Рабочий процесс менеджера предварительной загрузки
В этом разделе описывается типичный рабочий процесс приложения, использующего менеджер предварительной загрузки. В этом примере мы предполагаем, что приложение отображает карусель коротких видео. Выбранное видео воспроизводится автоматически, но пользователь может прокручивать карусель в любом направлении, что остановит воспроизводимое видео и запустит видео, к которому он прокрутил страницу.
Все эти шаги подробно обсуждаются на следующих страницах.
- Приложение создаёт целевой элемент управления состоянием предварительной загрузки . Менеджер предварительной загрузки опрашивает этот элемент управления, чтобы узнать объём каждого медиафайла, который необходимо загрузить.
- Приложение создаёт
DefaultPreloadManager.Builder
и передаёт целевой элемент управления состоянием предварительной загрузки. Затем приложение использует этот конструктор для создания менеджера предварительной загрузки . - Приложение добавляет медиа-элементы в менеджер предварительной загрузки . Для каждого элемента приложение предоставляет индекс , указывающий его положение в карусели.
- После добавления всех медиафайлов приложение вызывает метод
invalidate()
чтобы сообщить менеджеру предварительной загрузки о необходимости установить приоритеты для каждого элемента, а затем выполнить их предварительную загрузку. - Для каждого медиа-элемента менеджер предварительной загрузки обращается к целевому элементу управления предварительной загрузкой, чтобы узнать, какой объём элемента следует загрузить. Целевой элемент управления предварительной загрузкой может указать, нужно ли загрузить определённую длительность контента, загрузить только метаданные элемента или не загружать этот элемент в данный момент. Получив эту информацию, менеджер предварительной загрузки начинает загрузку медиа-контента.
- Когда пользователь начинает воспроизведение контента, приложение обращается к менеджеру предварительной загрузки , чтобы запросить
MediaSource
для этого медиаэлемента. Приложение также вызывает методsetCurrentPlayingIndex()
чтобы сообщить менеджеру предварительной загрузки, какой медиаэлемент воспроизводится в данный момент. - Если пользователь переходит к другому медиафайлу, приложение запрашивает этот элемент у менеджера предварительной загрузки и обновляет текущий индекс воспроизведения. Затем оно снова вызывает метод
invalidate()
чтобы сообщить менеджеру предварительной загрузки о необходимости обновить приоритеты в зависимости от текущего воспроизводимого контента. - Если приложение добавляет или удаляет элементы мультимедиа в карусель, оно также добавляет или удаляет эти элементы в менеджере предварительной загрузки и вызывает
invalidate()
после завершения этой операции. - Всякий раз, когда приоритеты менеджера предварительной загрузки становятся недействительными, он снова вызывает целевой элемент управления предварительной загрузкой, чтобы узнать, какой объем каждого элемента следует загрузить.
- Когда приложение закрывает карусель, оно освобождает менеджер предварительной загрузки , чтобы освободить свои ресурсы.