İçerikleri yönetme ve oynatma

Bu sayfada, video içeriğini yönetmek için önceden yükleme yöneticisinin nasıl kullanılacağı açıklanmaktadır. Önceden yükleme yöneticisi kullanarak kullanıcılara daha iyi bir deneyim sunabilirsiniz. Kullanıcı bir medya öğesinden diğerine geçtiğinde, yönetici içeriğin bir kısmını önceden yüklediği için oynatma daha hızlı başlar.

Bu sayfada aşağıdaki konular ele alınmaktadır:

Önceden yükleme yöneticisine medya öğeleri ekleme

Ön yükleme yöneticisine, izleyeceği her medya öğesi hakkında bilgi vermeniz gerekir. Örneğin, uygulamanızda video karuseli varsa bu videoları önceden yükleme yöneticisine eklersiniz. Kullanım alanınıza bağlı olarak tüm videoları veya yalnızca şu anda oynatılan videonun yakınındaki videoları ekleyebilirsiniz. Ön yükleme yöneticisine daha sonra yeni öğeler de ekleyebilirsiniz.

Medya öğelerinin eklenmesi, önceden yükleme yöneticisinin içeriği yüklemeye başlamasına tek başına neden olmaz. Ön yüklemeyi tetiklemek için ön yükleme yöneticisindeki öncelikleri geçersiz kılmanız gerekir.

val initialMediaItems = pullMediaItemsFromService(/* count= */ 20);
for (index in 0 until initialMediaItems.size) {
  preloadManager.add(initialMediaItems.get(index), /* rankingData= */ index)
}
// items aren't actually loaded yet! need to call invalidate() after this

Kodla ilgili önemli noktalar

  • Bu snippet, önceden yükleme yöneticisini oluşturduktan sonra ilk olarak nasıl dolduracağınızı gösterir. Ayrıca, öğeleri mevcut ve doldurulmuş bir ön yükleme yöneticisine eklemek için add() işlevini de çağırabilirsiniz.
  • Bu snippet'te pullMediaItemsFromService(), oynatılacak içerik listesini getirmek için kullanılan uygulama mantığıdır. Kod, en fazla 20 öğeden oluşan bir liste getirmek için bu yöntemi çağırır.
  • preloadManager, Tahmin segmenti oluşturmaDefaultPreloadManager bölümünde oluşturulan DefaultPreloadManager'dir. Kod, her öğeyi döngüye eklemek için yöneticinin add() yöntemini çağırır.
  • rankingData, önceden yükleme yöneticisinin her medya öğesinin önceliğini belirlemek için kullandığı bir değerdir. DefaultPreloadManager için rankingData, öğenin banttaki konumunu gösteren bir tam sayıdır. Ön yükleme yöneticisi, her öğenin şu anda oynatılan öğeden ne kadar uzakta olduğuna göre önceliği belirler.

Önceden yükleme yöneticisindeki öncelikleri geçersiz kılma

Önceden yükleme yöneticisinin içeriği önceden yüklemeye başlamasını tetiklemek için invalidate() işlevini çağırarak öğelerin önceliklerinin güncel olmadığını önceden yükleme yöneticisine bildirmeniz gerekir. Bu işlemi aşağıdaki durumlarda yapmanız gerekir:

  • Ön yükleme yöneticisine yeni medya öğeleri eklediğinizde veya medya öğelerini kaldırdığınızda Birden fazla öğe ekliyor veya kaldırıyorsanız hepsini eklemeli, ardından invalidate() işlevini çağırmalısınız.
  • Kullanıcı bir medya öğesinden diğerine geçtiğinde Bu durumda, İçeriği getirme ve oynatma bölümünde açıklandığı gibi, invalidate() işlevini çağırmadan önce mevcut oynatma dizinini güncellediğinizden emin olmanız gerekir.

Önceden yükleme yöneticisini geçersiz kıldığınızda, her öğeden ne kadar içerik yüklemesi gerektiğini öğrenmek için TargetPreloadStatusControl oluşturduğunuz çağrılır. Ardından, her öğenin içeriğini öncelik sırasına göre (yüksekten düşüğe) yükler.

preloadManager.invalidate()

Kodla ilgili önemli noktalar

  • Arama invalidate(), önceden yükleme yöneticisinin bildiği her medya öğesinin önceliğini yeniden değerlendirmesini tetikler. Bu nedenle, önceden yükleme yöneticisinde çok sayıda değişiklik yapıyorsanız invalidate() işlevini çağırmadan önce değişiklikleri tamamlamanız gerekir.

Medya içeriğini getirme ve oynatma

Kullanıcı yeni bir medya öğesine geçtiğinde, medya öğesini önceden yükleme yöneticisinden almanız gerekir. Ön yükleme yöneticisi içeriğin bir kısmını yüklediyse içerik, ön yükleme yöneticisini kullanmadığınız duruma kıyasla daha hızlı oynatılır. Önceden yükleme yöneticisi, öğedeki içeriği henüz yüklemediyse içerik normal şekilde oynatılır.

// When a media item is about to display on the screen
val mediaSource = preloadManager.getMediaSource(mediaItem)
if (mediaSource != null) {
    player.setMediaSource(mediaSource)
}
player.prepare()

// When the media item is displaying at the center of the screen
player.play()
preloadManager.setCurrentPlayingIndex(currentIndex)

// Need to call invalidate() to update the priorities
preloadManager.invalidate()

Kodla ilgili önemli noktalar

  • player, uygulamanın içeriği oynatmak için kullandığı Media3 ExoPlayer'tür. Bu oynatıcıyı, ön yükleme yöneticisini oluşturmak için kullandığınız aynı oluşturucuda DefaultPreloadManager.Builder.buildExoPlayer() çağrısı yaparak oluşturmanız gerekir.
  • Kullanıcı yeni bir medya öğesine geçtiğinde uygulama, önceden yükleme yöneticisinden medya kaynağını almak için getMediaSource() işlevini çağırır. Bu, mediaItem önceden yükleme yöneticisine eklediğiniz bir öğe olmalıdır. Önceden yükleme yöneticisi içeriği yüklemeye başlamamışsa sorun olmaz. Bu durumda, önceden yüklenmiş verileri olmayan bir MediaSource döndürülür. Örneğin, kullanıcının bir anda karusel içinde çok ileri gitmesi bu duruma neden olabilir.
  • Kullanıcı yeni medya öğesini oynattıktan sonra, yeni öğenin karuseldeki yerini önceden yükleme yöneticisine bildirmek için setCurrentPlayingIndex işlevini çağırın. Önceden yükleme yöneticisinin, sonraki öğenin yüklenmesine öncelik vermesi için bu bilgiye ihtiyacı vardır. Mevcut dizini güncelledikten sonra, preload yöneticisinin her öğenin önceliğini yeniden belirlemesi için invalidate() işlevini çağırın.

Ön yükleme yöneticisinden öğeleri kaldırma

Ön yükleme yöneticisinin verimli çalışmaya devam etmesi için, artık izlemesi gerekmeyen öğeleri kaldırmanız gerekir. Ayrıca, kullanıcıların mevcut konumundan çok uzakta olan ancak karusel içinde bulunan öğeleri de kaldırabilirsiniz. Örneğin, kullanıcının izlediği içerikten 15 öğeden daha uzakta olan bir öğenin önceden yüklenmesine gerek olmadığına karar verebilirsiniz. Bu durumda, öğeler o kadar uzaklaştığında kaldırılırdı. Kullanıcı, kaldırılan öğelere doğru hareket ederse öğeleri istediğiniz zaman tekrar ekleyebilirsiniz.

preloadManager.remove(mediaItem)

Kodla ilgili önemli noktalar

Ön yükleme yöneticisini işiniz bittiğinde serbest bırakın

Ön yükleme yöneticisine artık ihtiyacınız olmadığında kaynaklarını boşaltmak için yöneticinin serbest bırakılması gerekir. Özellikle, etkinliğiniz yok edildiğinde serbest bırakıldığından emin olun.

preloadManager.release()

Kodla ilgili önemli noktalar

  • Serbest bıraktıktan sonra nesnenin yöntemlerinden hiçbirini çağırmamalısınız.
  • Başka bir ön yükleme yöneticisi oluşturmanız gerekiyorsa yeni bir DefaultPreloadManager.Builder oluşturun ve bunu DefaultPreloadManager oluşturmak için kullanın. Eski oluşturucuyu yeniden kullanmaya çalışmayın.