Membuat dan mengonfigurasi DefaultPreloadManager

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 kasus DefaultPreloadManager, 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 objek ExoPlayer yang akan memutar konten yang dikelola oleh pengelola pramuat tersebut.