Mantenha tudo organizado com as coleções
Salve e categorize o conteúdo com base nas suas preferências.
O gerenciador de pré-carregamento ajuda você a oferecer uma experiência melhor aos usuários, veiculando conteúdo
mais rápido e com menos espera quando eles trocam de um item para outro. Ela também permite personalizar a duração e a classificação do pré-carregamento por item.
Uma situação comum nas redes sociais é quando um app mostra uma lista ou um carrossel de opções de mídia para o usuário. Por exemplo, um app pode mostrar um carrossel de vídeos curtos.
Quando um vídeo termina, o app passa para o próximo. Se o usuário não gostar do vídeo que está assistindo, ele pode deslizar para o próximo ou o anterior.
Se você não fizer o pré-carregamento, isso pode resultar em uma experiência frustrante para o usuário. O usuário termina de assistir um conteúdo e precisa esperar o próximo
carregar.
Por outro lado, se você pré-carregar o conteúdo de forma muito agressiva, isso desperdiça energia e largura de banda da rede ao carregar conteúdo que o usuário talvez nunca reproduza.
O DefaultPreloadManager ajuda seu app a equilibrar essas questões. O gerenciador de pré-carregamento
trabalha com seu app para decidir a importância de cada item de mídia e
carrega a quantidade adequada com antecedência.
Divisão do trabalho
Se você usa DefaultPreloadManager, parte do trabalho é feita pelo seu código e parte pelo
gerenciador de pré-carregamento.
O app precisa fazer o seguinte:
Crie os objetos ExoPlayer do app usando o mesmo objeto
DefaultPreloadManager.Builder que você usa para criar o gerenciador
de pré-carregamento. Chame DefaultPreloadManager.Builder.buildExoPlayer() para criar um
ExoPlayer.
Invalide as prioridades no gerenciador de pré-carregamento quando o conteúdo do carrossel mudar ou quando o usuário mudar o item que está reproduzindo. Isso
informa ao gerenciador de pré-carregamento para redeterminar a prioridade de cada item de mídia
e carregar o conteúdo, se necessário. Você vai invalidar o gerenciador de pré-carregamento depois de
adicionar itens de mídia pela primeira vez e também quando o usuário passar de um item para
outro ou quando você adicionar ou remover itens do carrossel.
Ele acompanha todos os itens de mídia que o app adicionou.
Cada vez que as prioridades são invalidadas, ele consulta seu app chamando um
TargetPreloadStatusControl implementado pelo app. Ele faz isso para
descobrir quanto de cada item de mídia carregar.
Depois de consultar o app, ele pré-carrega a quantidade adequada de cada item de mídia. O gerenciador de pré-carregamento decide em que ordem carregar o item. Ele prioriza os itens mais próximos do que o usuário está tocando.
Quando o app solicita conteúdo, o gerenciador de pré-carregamento fornece um MediaSource
com o conteúdo já carregado.
Fluxo de trabalho do gerenciador de pré-carregamento
Esta seção descreve um fluxo de trabalho típico para um app que usa o gerenciador de pré-carregamento. Neste exemplo, vamos supor que o app mostre um carrossel de vídeos curtos.
O vídeo selecionado é reproduzido automaticamente, mas o usuário pode rolar o carrossel em qualquer direção, o que interrompe o vídeo em exibição e inicia o vídeo para o qual ele rola.
Todas essas etapas são discutidas em detalhes nas páginas a seguir.
Depois que toda a mídia for adicionada, o app vai chamarinvalidate() para informar
ao gerenciador de pré-carregamento que defina as prioridades de cada item e faça o pré-carregamento.
Para cada item de mídia, o gerenciador de pré-carregamento chama o controle de pré-carregamento de destino para
consultar quanto do item deve ser carregado. O controle de pré-carregamento de destino
pode dizer para carregar uma determinada duração de conteúdo, apenas buscar os
metadados do item ou não buscar nada desse item no momento. Depois que o gerenciador de pré-carregamento
recebe essas informações, ele começa a carregar o conteúdo de mídia.
Quando o usuário começa a reproduzir conteúdo, o app chama o gerenciador de pré-carregamento
para solicitar um MediaSource para esse item de mídia. O app também chama
setCurrentPlayingIndex() para informar ao gerenciador de pré-carregamento qual item de mídia está
sendo reproduzido.
Se o usuário passar para outro item de mídia, o app vai solicitar esse item ao
gerenciador de pré-carregamento e também atualizar o índice de reprodução atual. Em seguida, ele
chama invalidate() novamente para informar ao gerenciador de pré-carregamento que atualize as
prioridades com base no que está sendo reproduzido.
Se o app adicionar ou remover itens de mídia do carrossel, ele também vai adicionar ou
remover esses itens do gerenciador de pré-carregamento e chamar invalidate() quando
isso for concluído.
Sempre que as prioridades do gerenciador de pré-carregamento são invalidadas, ele chama o
controle de pré-carregamento de destino mais uma vez para descobrir quanto de cada item carregar.
O conteúdo e os exemplos de código nesta página estão sujeitos às licenças descritas na Licença de conteúdo. Java e OpenJDK são marcas registradas da Oracle e/ou suas afiliadas.
Última atualização 2025-08-27 UTC.
[[["Fácil de entender","easyToUnderstand","thumb-up"],["Meu problema foi resolvido","solvedMyProblem","thumb-up"],["Outro","otherUp","thumb-up"]],[["Não contém as informações de que eu preciso","missingTheInformationINeed","thumb-down"],["Muito complicado / etapas demais","tooComplicatedTooManySteps","thumb-down"],["Desatualizado","outOfDate","thumb-down"],["Problema na tradução","translationIssue","thumb-down"],["Problema com as amostras / o código","samplesCodeIssue","thumb-down"],["Outro","otherDown","thumb-down"]],["Última atualização 2025-08-27 UTC."],[],[],null,["# Preload manager concepts\n\nThe preload manager helps you give users a better experience by serving content\nto them faster, with less waiting when they switch from one item to another. It\nalso lets you customize the duration and ranking of preloading per item.\n\nA common situation in social media is, an app shows a list or carousel of media\nchoices to the user. For example, an app might show a carousel of short videos.\nWhen one video finishes, the app switches to the next one. And if the user\ndoesn't like the video they're watching, they might swipe away to the next\nvideo, or the previous one.\n\nIf you don't preload video content, this can result in a frustrating user\nexperience. The user finishes with some media and then has to wait for the next\nmedia to load.\n\nOn the other hand, if you preload the content too aggressively,\nthat wastes power and network bandwidth loading content that the user may never\nactually play.\n\n[`DefaultPreloadManager`](/reference/androidx/media3/exoplayer/source/preload/DefaultPreloadManager) helps your app balance these concerns. The preload\nmanager works with your app to decide how important each media item is, and\nloads the appropriate amount in advance.\n\n### Division of labor\n\nIf you use `DefaultPreloadManager`, some work is done by your code, and some by\nthe preload manager.\n\nYour app has to do the following:\n\n- Create the app's `ExoPlayer` objects by using the same `DefaultPreloadManager.Builder` object you use to create the preload manager. Call `DefaultPreloadManager.Builder.buildExoPlayer()` to create an `ExoPlayer`.\n- [Tell the preload manager about each media item it should be tracking](/media/media3/exoplayer/preloading-media/preloadmanager/manage-play#add-items). This might not be all the content in the carousel; instead, you can just tell it about the first few items to be played. As the user navigates through the carousel, you can add [and remove](/media/media3/exoplayer/preloading-media/preloadmanager/manage-play#remove) media items from the preload manager's pool.\n- [Invalidate the priorities in the preload manager](/media/media3/exoplayer/preloading-media/preloadmanager/manage-play#invalidate) when the content in the carousel changes, or the user changes which item they're playing. This tells the preload manager to redetermine the priority of each media item, and load content if necessary. You'll invalidate the preload manager after you first add media items, and also when the user moves from one item to another, or when you add or remove items to the carousel.\n- [Respond to queries from the preload manager](/media/media3/exoplayer/preloading-media/preloadmanager/create#create-tpsc), telling the manager *how\n much* content to preload for each item.\n- [Fetch media from the preload manager](/media/media3/exoplayer/preloading-media/preloadmanager/manage-play#fetch-play) when the user starts playing an\n item. The preload manager gives your app a `MediaSource` for that content.\n\n | **Important:** The `MediaSource` returned by the preload manager must be played on an `ExoPlayer` created by that preload manager's builder.\n- [Release the preload manager](/media/media3/exoplayer/preloading-media/preloadmanager/manage-play#release) when you're done with it, freeing its\n resources.\n\nThe preload manager does the following:\n\n- It keeps track of all the media items your app has added to it.\n- Each time its priorities are invalidated, it queries your app by calling a [`TargetPreloadStatusControl`](/reference/androidx/media3/exoplayer/source/preload/TargetPreloadStatusControl) implemented by your app. It calls this to find out *how much* of each media item to load.\n- After it queries the app, it preloads the appropriate amount of each media item. The preload manager decides what order to load the item. It prioritizes items that are closest to the item the user's playing.\n- When the app requests content, the preload manager provides a `MediaSource` with whatever content has already been loaded.\n\n| **Note:** Your app decides *how much* of each media item should be preloaded, and tells the preload manager where each media item is in the carousel, as well as which item is currently playing. The preload manager decides what order to load the items, based on how close each item is to the item that's currently playing.\n\n### Preload manager workflow\n\nThis section describes a typical workflow for an app that uses the preload\nmanager. In this example, we assume the app displays a carousel of short videos.\nThe selected video plays automatically, but the user can scroll the carousel in\neither direction, which stops the video that was playing and starts the video\nthey scroll to.\n\nAll these steps are discussed in detail in the following pages.\n\n1. [The app creates a](/media/media3/exoplayer/preloading-media/preloadmanager/create#create-tpsc) [*target preload status control*](/media/media3/exoplayer/preloading-media/preloadmanager/create#create-tpsc). The preload manager queries this control to find out how much of each media item to load.\n2. The app creates a `DefaultPreloadManager.Builder`, and passes the target preload status control. The app then [uses the builder to create the preload\n manager](/media/media3/exoplayer/preloading-media/preloadmanager/create#create-dpm).\n3. The app [adds media items to the preload manager](/media/media3/exoplayer/preloading-media/preloadmanager/manage-play#add-items). The app provides an *index* for each item, specifying the item's position in the carousel.\n4. After all the media is added, [the app calls](/media/media3/exoplayer/preloading-media/preloadmanager/manage-play#invalidate) [`invalidate()`](/media/media3/exoplayer/preloading-media/preloadmanager/manage-play#invalidate) to tell the preload manager to set the priorities for each item then preload them.\n5. For each media item, the preload manager calls the target preload control to query how much of the item should be loaded. The target preload control might say to load a certain duration of content, just fetch the item's metadata, or not fetch any of that item at this time. After the preload manager has gotten this information, it starts loading the media content.\n6. When the user starts playing content, [the app calls the preload manager](/media/media3/exoplayer/preloading-media/preloadmanager/manage-play#fetch-play) to request a `MediaSource` for that media item. The app also calls `setCurrentPlayingIndex()` to tell the preload manager which media item is being played.\n7. If the user moves to a different media item, the app requests that item from the preload manager, and also updates the current playing index. It then calls `invalidate()` again to tell the preload manager to update its priorities based on what's now being played.\n8. If the app adds or removes media items to the carousel, it also adds or removes those items to the preload manager, and calls `invalidate()` when it's done doing that.\n9. Whenever the preload manager's priorities are invalidated, it calls the target preload control once again to find out how much of each item to load.\n10. When the app closes the carousel, it [releases the preload manager](/media/media3/exoplayer/preloading-media/preloadmanager/manage-play#release) to free its resources."]]