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