یک DefaultPreloadManager ایجاد و پیکربندی کنید

این صفحه نحوه ایجاد یک DefaultPreloadManager را شرح می‌دهد که محتوای رسانه‌ای را برای برنامه شما بر اساس استراتژی انتخابی شما از قبل بارگذاری می‌کند.

Preload managers based on the BasePreloadManager abstract class let you rank content by the criteria you choose. This document explains how to use the derived class DefaultPreloadManager , in which each media item is ranked with an integer representing its location in a list (for example, its position in a video carousel). The preload manager prioritizes loading the items based on how close it is to the item the user is currently playing. That way, if a user moves to another item, the new item can start playing right away.

سه مرحله برای ایجاد یک نمونه از DefaultPreloadManager وجود دارد:

  • یک TargetPreloadStatusControl تعریف کنید که مدیر پیش‌بارگذاری بتواند با پرس‌وجو بفهمد که آیا آیتم رسانه‌ای آماده بارگذاری است و چقدر باید بارگذاری شود.
  • سازنده‌ای را ایجاد کنید که برای ایجاد مدیر پیش‌بارگذاری و ایجاد اشیاء ExoPlayer برنامه‌تان از آن استفاده خواهید کرد.
  • با فراخوانی متد build() از سازنده، از آن برای ایجاد مدیر پیش‌بارگذاری استفاده کنید.

ایجاد یک کنترل وضعیت پیش بارگذاری هدف

وقتی DefaultPreloadManager.Builder را ایجاد می‌کنید، یک شیء کنترل وضعیت پیش‌بارگذاری هدف که تعریف می‌کنید را به آن منتقل خواهید کرد. این شیء رابط TargetPreloadStatusControl را پیاده‌سازی می‌کند. وقتی مدیر پیش‌بارگذاری آماده‌ی پیش‌بارگذاری رسانه می‌شود، متد getTargetPreloadStatus() کنترل وضعیت شما را فراخوانی می‌کند تا بفهمد چه مقدار محتوا باید بارگذاری شود. کنترل وضعیت می‌تواند با یکی از این کدهای وضعیت پاسخ دهد:

  • STAGE_SPECIFIED_RANGE_LOADED : مدیر پیش‌بارگذاری باید محتوا را از موقعیت شروع مشخص‌شده و برای مدت زمان مشخص‌شده (برحسب میلی‌ثانیه) بارگذاری کند.
  • STAGE_TRACKS_SELECTED : مدیر پیش‌بارگذاری باید اطلاعات آهنگ محتوا را بارگذاری و پردازش کند و آهنگ‌ها را انتخاب کند. مدیر پیش‌بارگذاری هنوز نباید بارگذاری محتوا را شروع کند.
  • STAGE_SOURCE_PREPARED : مدیر پیش‌بارگذاری باید منبع محتوا را آماده کند. برای مثال، اگر فراداده محتوا در یک فایل مانیفست جداگانه باشد، مدیر پیش‌بارگذاری ممکن است آن مانیفست را دریافت و تجزیه کند.
  • null : مدیر پیش‌بارگذاری نباید هیچ محتوا یا فراداده‌ای را برای آن مورد رسانه بارگذاری کند.

شما باید یک استراتژی برای تصمیم‌گیری در مورد میزان محتوای بارگذاری شده برای هر آیتم رسانه‌ای داشته باشید. در این مثال، محتوای بیشتری برای آیتم‌هایی که به آیتمی که در حال پخش است نزدیک‌تر هستند بارگذاری می‌شود. اگر کاربر در حال پخش محتوایی با اندیس n باشد، کنترلر کدهای زیر را برمی‌گرداند:

  • فهرست n+1 (آیتم رسانه بعدی): بارگیری ۳۰۰۰ میلی‌ثانیه (۳ ثانیه) از موقعیت شروع پیش‌فرض
  • فهرست n-1 (آیتم رسانه قبلی): بارگیری ۱۰۰۰ میلی‌ثانیه (۱ ثانیه) از موقعیت شروع پیش‌فرض
  • سایر موارد رسانه‌ای در محدوده n-2 تا n+2 : مقدار PreloadStatus.TRACKS_SELECTED را برمی‌گرداند.
  • سایر موارد رسانه‌ای در محدوده n-4 تا n+4 : PreloadStatus.SOURCE_PREPARED را برمی‌گرداند.
  • برای سایر موارد رسانه‌ای، null را برمی‌گرداند.

class MyTargetPreloadStatusControl(var currentPlayingIndex: Int = 0) :
  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.PRELOAD_STATUS_TRACKS_SELECTED
    } else if (abs(index - currentPlayingIndex) <= 4) {
      // return a PreloadStatus that is labelled by STAGE_SOURCE_PREPARED
      return DefaultPreloadManager.PreloadStatus.PRELOAD_STATUS_SOURCE_PREPARED
    }
    return DefaultPreloadManager.PreloadStatus.PRELOAD_STATUS_NOT_PRELOADED
  }
}

نکات کلیدی در مورد کد

  • هنگام ایجاد، یک نمونه از MyTargetPreloadStatusControl را به سازنده‌ی preload manager ارسال خواهید کرد.
  • currentPlayingIndex فهرست هر آیتم رسانه‌ای که در حال پخش است را نگه می‌دارد. این وظیفه برنامه است که این مقدار را به‌روز نگه دارد.
  • وقتی مدیر پیش‌بارگذاری آماده بارگذاری محتوا شد، تابع getTargetPreloadStatus را فراخوانی می‌کند و اطلاعات رتبه‌بندی که برای آن آیتم رسانه‌ای مربوطه مشخص کرده‌اید را ارسال می‌کند. در مورد DefaultPreloadManager ، این اطلاعات رتبه‌بندی یک عدد صحیح است که موقعیت آیتم را در یک چرخ فلک مشخص می‌کند. این متد با مقایسه آن شاخص با شاخص آیتمی که در حال حاضر انتخاب شده است، کدی را که باید برگرداند، انتخاب می‌کند.

مدیر پیش بارگذاری را ایجاد کنید

برای ایجاد مدیریت پیش‌بارگذاری (preload manager)، به یک DefaultPreloadManager.Builder نیاز دارید. این سازنده با زمینه فعلی و کنترل وضعیت پیش‌بارگذاری هدف برنامه پیکربندی شده است. این سازنده همچنین متدهای تنظیم‌کننده (setter) را ارائه می‌دهد که می‌توانید از آنها برای تنظیم اجزای سفارشی مدیریت پیش‌بارگذاری استفاده کنید.

علاوه بر استفاده از سازنده برای ایجاد مدیر پیش‌بارگذاری، از آن برای ایجاد اشیاء ExoPlayer که برنامه شما برای پخش محتوا از آنها استفاده می‌کند نیز استفاده خواهید کرد.

val targetPreloadStatusControl = MyTargetPreloadStatusControl()
val preloadManagerBuilder = DefaultPreloadManager.Builder(context, targetPreloadStatusControl)
val preloadManager = preloadManagerBuilder.build()

نکات کلیدی در مورد کد

  • MyTargetPreloadStatusControl کلاسی است که شما در Create a target preload status control تعریف کرده‌اید.
  • شما از همان DefaultPreloadManager.Builder برای ایجاد اشیاء ExoPlayer که محتوای مدیریت شده توسط آن مدیر پیش بارگذاری را پخش می‌کنند، استفاده خواهید کرد.