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
- Membatalkan validasi prioritas di pengelola pramuat
- Mengambil dan memutar media
- Menghapus item dari pengelola pra-muat
- Melepaskan pengelola pra-muat setelah Anda selesai menggunakannya
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
adalahDefaultPreloadManager
yang dibuat di BuatDefaultPreloadManager
. Kode memanggil metodeadd()
pengelola tersebut untuk menambahkan setiap item di carousel.rankingData
adalah nilai yang digunakan pengelola pramuat untuk menentukan prioritas setiap item media. UntukDefaultPreloadManager
,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 memanggilinvalidate()
.
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 Media3ExoPlayer
yang digunakan aplikasi untuk memutar konten. Anda harus membuat pemutar tersebut dengan memanggilDefaultPreloadManager.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 berupamediaItem
yang telah ditambahkan ke pengelola pramuat. Tidak masalah jika pengelola pra-muat belum mulai memuat konten; dalam hal ini, pengelola akan menampilkanMediaSource
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, panggilinvalidate()
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
- Jika ingin menghapus semua item dari pengelola pramuat, Anda dapat memanggil
reset()
, bukanremove()
. Pendekatan ini berguna jika Anda perlu mengubah semua item dalam carousel. Dalam hal ini, setelah menghapus item, Anda harus menambahkan item baru ke pengelola pramuat, lalu membatalkan validasi prioritas di pengelola pramuat.
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 membuatDefaultPreloadManager
. Jangan mencoba menggunakan kembali builder lama.