Halaman ini menjelaskan cara membuat DefaultPreloadManager
, yang memuat konten media untuk aplikasi Anda berdasarkan strategi yang Anda pilih.
Pengelola pra-muat berdasarkan class abstrak BasePreloadManager
memungkinkan Anda memberi peringkat konten berdasarkan kriteria yang Anda pilih. Dokumen ini menjelaskan cara menggunakan
class turunan DefaultPreloadManager
, yang setiap item medianya diberi peringkat dengan
bilangan bulat yang merepresentasikan lokasinya dalam daftar (misalnya, posisinya dalam
carousel video). Pengelola pra-muat memprioritaskan pemuatan item berdasarkan seberapa dekat item tersebut dengan item yang sedang diputar pengguna. Dengan begitu, jika pengguna beralih ke item lain, item baru dapat langsung diputar.
Ada tiga langkah untuk membuat instance DefaultPreloadManager
:
- Tentukan
TargetPreloadStatusControl
yang dapat dikueri oleh pengelola pra-muat untuk mengetahui apakah item media siap dimuat dan berapa banyak yang harus dimuat. - Buat builder yang akan Anda gunakan untuk membuat pengelola pramuat, dan
untuk membuat objek
ExoPlayer
aplikasi Anda. - Gunakan builder untuk membuat pengelola pramuat dengan memanggil metode
build()
builder.
Membuat kontrol status pra-pemuatan target
Saat membuat DefaultPreloadManager.Builder
, Anda akan meneruskan objek
kontrol status pramuat target yang Anda tentukan. Objek ini mengimplementasikan
antarmuka TargetPreloadStatusControl
. Saat pengelola pramuat
bersiap untuk mempramuat media, pengelola akan memanggil metode
getTargetPreloadStatus()
kontrol status Anda untuk mengetahui jumlah konten yang akan dimuat. Kontrol status dapat membalas dengan salah satu kode status berikut:
STAGE_SPECIFIED_RANGE_LOADED
: Pengelola pra-muat harus memuat konten dari posisi awal yang ditentukan dan selama durasi yang ditentukan (diberikan dalam milidetik).STAGE_TRACKS_SELECTED
: Pengelola pra-muat harus memuat dan memproses informasi jalur konten, lalu memilih jalur. Pengelola pra-muat belum boleh mulai memuat konten.STAGE_SOURCE_PREPARED
: Pengelola pra-muat harus menyiapkan sumber konten. Misalnya, jika metadata konten berada dalam file manifes terpisah, pengelola pra-muat dapat mengambil dan mengurai manifes tersebut.null
: Pengelola pra-muat tidak boleh memuat konten atau metadata apa pun untuk item media tersebut.
Anda harus memiliki strategi untuk memutuskan jumlah konten yang akan dimuat untuk setiap item media. Dalam contoh ini, lebih banyak konten dimuat untuk item yang paling dekat dengan item yang sedang diputar. Jika pengguna memutar konten dengan indeks n, pengontrol akan menampilkan kode berikut:
- Indeks n+1 (item media berikutnya): Muat 3000 md (3 detik) dari posisi awal default
- Indeks n-1 (item media sebelumnya): Memuat 1000 md (1 detik) dari posisi awal default
- Item media lain dalam rentang n-2 hingga n+2: Return
PreloadStatus.TRACKS_SELECTED
- Item media lainnya dalam rentang n-4 hingga n+4: Return
PreloadStatus.SOURCE_PREPARED
- Untuk semua item media lainnya, tampilkan
null
class MyTargetPreloadStatusControl(
currentPlayingIndex: Int = C.INDEX_UNSET
): TargetPreloadStatusControl<Int, DefaultPreloadManager.PreloadStatus> {
override fun getTargetPreloadStatus(index: Int):
DefaultPreloadManager.PreloadStatus? {
if (index - currentPlayingIndex == 1) { // next track
// return a PreloadStatus that is labelled by STAGE_SPECIFIED_RANGE_LOADED
// and suggest loading 3000ms from the default start position
return DefaultPreloadManager.PreloadStatus.specifiedRangeLoaded(3000L)
} else if (index - currentPlayingIndex == -1) { // previous track
// return a PreloadStatus that is labelled by STAGE_SPECIFIED_RANGE_LOADED
// and suggest loading 3000ms from the default start position
return DefaultPreloadManager.PreloadStatus.specifiedRangeLoaded(3000L)
} else if (abs(index - currentPlayingIndex) == 2) {
// return a PreloadStatus that is labelled by STAGE_TRACKS_SELECTED
return DefaultPreloadManager.PreloadStatus.TRACKS_SELECTED
} else if (abs(index - currentPlayingIndex) <= 4) {
// return a PreloadStatus that is labelled by STAGE_SOURCE_PREPARED
return DefaultPreloadManager.PreloadStatus.SOURCE_PREPARED
}
return null
}
}
Poin penting tentang kode
- Anda akan meneruskan instance
MyTargetPreloadStatusControl
ke builder pengelola pra-muat saat Anda membuatnya. currentPlayingIndex
menyimpan indeks item media apa pun yang sedang diputar. Tugas aplikasi adalah menjaga agar nilai tersebut tetap terbaru.- Saat siap memuat konten, pengelola pra-muat akan memanggil
getTargetPreloadStatus
dan meneruskan informasi peringkat yang Anda tentukan untuk item media yang sesuai. Dalam kasusDefaultPreloadManager
, informasi peringkat tersebut adalah bilangan bulat, yang menentukan posisi item dalam carousel. Metode ini memilih kode yang akan ditampilkan dengan membandingkan indeks tersebut dengan indeks item yang saat ini dipilih.
Buat pengelola pra-muat
Untuk membuat pengelola pramuat, Anda memerlukan DefaultPreloadManager.Builder
.
Builder tersebut dikonfigurasi dengan konteks saat ini dan kontrol status pra-muat target aplikasi. Builder juga menyediakan metode setter yang dapat Anda gunakan untuk
menetapkan komponen kustom pengelola pra-muat.
Selain menggunakan builder untuk membuat pengelola pramuat, Anda juga akan menggunakannya untuk membuat objek ExoPlayer
yang digunakan aplikasi Anda untuk memutar konten.
val targetPreloadStatusControl = MyTargetPreloadStatusControl()
val preloadManagerBuilder = DefaultPreloadManager.Builder(context, targetPreloadStatusControl)
val preloadManager = preloadManagerBuilder.build()
Poin penting tentang kode
MyTargetPreloadStatusControl
adalah class yang Anda tentukan di Membuat kontrol status pra-pemuatan target.- Anda akan menggunakan
DefaultPreloadManager.Builder
yang sama untuk membuat objekExoPlayer
yang akan memutar konten yang dikelola oleh pengelola pramuat tersebut.