Mengelola dan memutar konten

Halaman ini menjelaskan cara menggunakan pengelola pramuat untuk mengelola konten video. Dengan menggunakan pengelola pra-muat, 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 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 menambahkan video tersebut 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 pra-muat nanti.

Menambahkan item media saja tidak menyebabkan pengelola pra-muat mulai memuat konten. Untuk memicu pramuat, Anda harus membatalkan validasi prioritas di pengelola pramuat.

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

Poin penting tentang kode

  • Cuplikan ini menunjukkan cara mengisi pengelola pramuat untuk pertama kalinya setelah Anda membuatnya. Anda juga dapat memanggil add() untuk menambahkan item ke pengelola pramuat yang 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. Kode memanggil metode add() pengelola tersebut untuk menambahkan setiap item di carousel.
  • 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 pra-muat menentukan prioritas berdasarkan seberapa jauh setiap item dari item yang sedang diputar.

Membatalkan prioritas di pengelola pra-muat

Untuk memicu pengelola pra-muat agar mulai melakukan pra-muat konten, Anda harus memanggil invalidate() untuk memberi tahu pengelola pra-muat bahwa prioritas item sudah tidak berlaku. Anda harus melakukannya dalam situasi berikut:

  • Saat Anda menambahkan item media baru ke pengelola pramuat, atau menghapus item media. Jika Anda menambahkan atau menghapus beberapa item, Anda harus menambahkan semuanya, lalu memanggil invalidate().
  • Saat pengguna beralih dari satu item media ke item media lainnya. Dalam hal ini, Anda harus memastikan untuk memperbarui indeks pemutaran saat ini sebelum memanggil invalidate(), seperti yang dijelaskan dalam Mengambil dan memutar konten.

Saat Anda membatalkan validasi pengelola pramuat, pengelola tersebut akan memanggil TargetPreloadStatusControl yang Anda buat untuk mengetahui jumlah konten yang harus dimuat dari setiap item. Kemudian, konten dimuat untuk setiap item dalam urutan prioritasnya dari tinggi ke rendah.

preloadManager.invalidate()

Poin penting tentang kode

  • Memanggil invalidate() akan memicu pengelola pra-muat untuk mengevaluasi ulang prioritas setiap item media yang diketahuinya. Oleh karena itu, jika Anda melakukan banyak perubahan pada pengelola pramuat, Anda harus menyelesaikan perubahan sebelum memanggil invalidate().

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.

// 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()

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 ditambahkan ke pengelola pramuat. 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 pramuat posisi item baru dalam carousel. Pengelola pramuat memerlukan informasi tersebut untuk memprioritaskan pemuatan item berikutnya. Setelah Anda memperbarui indeks saat ini, panggil invalidate() untuk membuat pengelola pramuat menentukan kembali prioritas untuk setiap item.

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.

preloadManager.remove(mediaItem)

Poin penting tentang kode

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 setelah Anda melepaskannya.
  • Jika Anda perlu membuat pengelola pramuat lain, buat DefaultPreloadManager.Builder baru dan gunakan untuk membuat DefaultPreloadManager. Jangan mencoba menggunakan kembali builder lama.