Mengelola dan memutar konten

Halaman ini menjelaskan cara menggunakan pengelola pramuat untuk mengelola konten video. Dengan menggunakan pengelola pramuat, Anda dapat memberikan pengalaman yang lebih baik kepada pengguna; saat pengguna beralih dari satu item media ke item media lain, pemutaran dimulai lebih cepat karena pengelola telah memuat beberapa konten.

Halaman ini membahas beberapa topik berikut:

Menambahkan item media ke pengelola pramuat

Anda harus memberi tahu pengelola pramuat tentang setiap item media yang akan dilacaknya. Misalnya, jika aplikasi Anda memiliki carousel video, Anda akan menambahkannya ke pengelola pramuat. Bergantung pada kasus penggunaan, Anda dapat menambahkan semua video, atau hanya semua video di dekat video yang sedang diputar. Anda juga dapat menambahkan item baru ke pengelola pramuat nanti.

Untuk melakukannya, gunakan metode penambahan batch seperti addMediaItems. Atau, Anda dapat memanggil add (atau addMediaSource) untuk menambahkan item media satu per satu. Namun, menambahkan item media satu per satu tidak akan otomatis memicu pra-pemuatan. Saat menggunakan metode individual, Anda harus memanggil invalidate secara eksplisit setelah selesai menambahkan item untuk memberi tahu pengelola pramuat agar memperbarui prioritas dan memulai pramuat.

val initialMediaItems = pullMediaItemsFromService(count = 20)
val rankingDataList = initialMediaItems.indices.toList()
preloadManager.addMediaItems(initialMediaItems, rankingDataList)

Poin penting tentang kode

  • Cuplikan ini menunjukkan cara mengisi pengelola pramuat secara awal dalam mode batch setelah Anda membuatnya. Anda dapat memanggil addMediaItems untuk menambahkan item ke pengelola pramuat yang sudah ada dan terisi.
  • Dalam cuplikan ini, pullMediaItemsFromService() adalah logika aplikasi untuk mengambil daftar konten yang akan diputar. Kode memanggil metode tersebut untuk mengambil daftar hingga 20 item.
  • preloadManager adalah DefaultPreloadManager yang dibuat di Buat DefaultPreloadManager.
  • rankingData adalah nilai yang digunakan pengelola pramuat untuk menentukan prioritas setiap item media. Untuk DefaultPreloadManager, rankingData adalah bilangan bulat yang merepresentasikan posisi item dalam carousel. Pengelola pramuat menentukan prioritas berdasarkan seberapa jauh setiap item dari item yang sedang diputar.

Mengambil dan memutar media

Saat pengguna beralih ke item media baru, Anda perlu mendapatkan item media dari pengelola pramuat. Jika pengelola pramuat telah memuat konten, konten akan diputar lebih cepat daripada jika Anda tidak menggunakan pengelola pramuat. Jika pengelola pramuat belum memuat konten dari item tersebut, konten akan diputar secara normal.

Anda juga perlu mengupdate indeks pemutaran saat ini di pengelola pramuat dengan memanggil setCurrentPlayingIndex, yang memungkinkan pengelola pramuat menentukan prioritas operasi pramuat mendatang.

// When a media item is about to be displayed on the screen
val mediaSource = preloadManager.getMediaSource(mediaItem)
if (mediaSource != null) {
  player.setMediaSource(mediaSource)
} else {
  // If the mediaSource is null, its mediaItem hasn't been added to the preload
  // manager yet. Send it directly to the player when it's about to play.
  player.setMediaItem(mediaItem)
}
player.prepare()

// When the media item is being displayed at the center of the screen ("in focus")
player.play()
// Update the current playing index to let the preload manager know where the user
// is in the carousel/pagination/list.
preloadManager.setCurrentPlayingIndex(currentIndex)

Poin penting tentang kode

  • player adalah Media3 ExoPlayer yang digunakan aplikasi untuk memutar konten. Anda harus membuat pemutar tersebut dengan memanggil DefaultPreloadManager.Builder.buildExoPlayer() pada builder yang sama yang Anda gunakan untuk membuat pengelola pramuat.
  • Saat pengguna beralih ke item media baru, aplikasi akan memanggil getMediaSource() untuk mendapatkan sumber media dari pengelola pramuat. Ini harus berupa mediaItem yang telah Anda tambahkan ke pengelola pra-muat. Tidak masalah jika pengelola pra-muat belum mulai memuat konten; dalam hal ini, pengelola akan menampilkan MediaSource yang tidak memiliki data yang sudah dimuat sebelumnya. Misalnya, hal ini dapat terjadi jika pengguna tiba-tiba melompat jauh ke depan dalam carousel.
  • Setelah pengguna memutar item media baru, panggil setCurrentPlayingIndex untuk memberi tahu pengelola pra-muat posisi item baru dalam carousel. Pengelola pra-muat memerlukan informasi tersebut untuk memprioritaskan pemuatan item berikutnya.

Menghapus item dari pengelola pramuat

Agar pengelola pramuat tetap efisien, Anda harus menghapus item yang tidak perlu lagi dilacak oleh pengelola pramuat. Anda juga dapat menghapus item yang masih ada di carousel, tetapi jauh dari posisi pengguna saat ini. Misalnya, Anda dapat memutuskan bahwa jika item berjarak lebih dari 15 item dari apa yang ditonton pengguna, item tersebut tidak perlu dimuat sebelumnya. Dalam hal ini, Anda akan menghapus item saat item tersebut sudah terlalu jauh. Jika pengguna kembali ke item yang dihapus tersebut, Anda dapat menambahkannya kembali.

Jika Anda memiliki daftar item media yang akan dihapus, Anda dapat menggunakan removeMediaItems. Atau, Anda dapat memanggil remove (atau removeMediaSource) untuk menghapus item media satu per satu.

preloadManager.removeMediaItems(mediaItemsToRemove)

Poin penting tentang kode

  • Jika ingin menghapus semua item dari pengelola pra-muat, Anda dapat memanggil reset(), bukan remove(). Pendekatan ini berguna jika Anda perlu mengubah semua item di carousel. Jika demikian, setelah menghapus item, Anda harus menambahkan item baru ke pengelola pra-muat.

Lepaskan pengelola pra-muat setelah Anda selesai menggunakannya

Jika Anda tidak lagi memerlukan pengelola pramuat, Anda harus melepaskannya untuk membebaskan resourcenya. Khususnya, pastikan untuk melepaskannya saat aktivitas Anda dihancurkan.

preloadManager.release()

Poin penting tentang kode

  • Anda tidak boleh memanggil metode objek apa pun setelah melepaskannya.
  • Jika Anda perlu membuat pengelola pramuat lain, buat DefaultPreloadManager.Builder baru dan gunakan untuk membuat DefaultPreloadManager. Jangan mencoba menggunakan kembali builder lama.