إنشاء DefaultPreloadManager وإعداده

توضّح هذه الصفحة كيفية إنشاء DefaultPreloadManager الذي يحمّل مسبقًا محتوى الوسائط لتطبيقك استنادًا إلى الاستراتيجية التي تختارها.

تتيح لك أدوات إدارة التحميل المسبق المستندة إلى الفئة المجرّدة BasePreloadManager ترتيب المحتوى حسب المعايير التي تختارها. يوضّح هذا المستند كيفية استخدام الفئة المشتقّة DefaultPreloadManager، حيث يتم ترتيب كل ملف وسائط باستخدام عدد صحيح يمثّل موقعه في قائمة (على سبيل المثال، موقعه في لوحة عرض دوّارة للفيديوهات). تعطي أداة إدارة التحميل المسبق الأولوية لتحميل الملفات استنادًا إلى مدى قربها من الملف الذي يشغّله المستخدم حاليًا. بهذه الطريقة، إذا انتقل المستخدم إلى ملف آخر، يمكن أن يبدأ تشغيل الملف الجديد على الفور.

هناك ثلاث خطوات لإنشاء مثيل من DefaultPreloadManager:

  • حدِّد TargetPreloadStatusControl يمكن لأداة إدارة التحميل المسبق الاستعلام عنه لمعرفة ما إذا كان ملف الوسائط جاهزًا للتحميل ومقدار المحتوى المطلوب تحميله.
  • أنشئ أداة الإنشاء التي ستستخدمها لإنشاء أداة إدارة التحميل المسبق، و لإنشاء كائنات ExoPlayer في تطبيقك.
  • استخدِم أداة الإنشاء لإنشاء أداة إدارة التحميل المسبق من خلال استدعاء طريقة build() أداة الإنشاء.

إنشاء عنصر تحكّم في حالة التحميل المسبق المستهدَفة

عند إنشاء DefaultPreloadManager.Builder، عليك تمرير كائن عنصر تحكّم في حالة التحميل المسبق المستهدَفة الذي تحدّده. ينفّذ هذا الكائن واجهة TargetPreloadStatusControl. عندما تكون أداة إدارة التحميل المسبق على وشك تحميل الوسائط مسبقًا، فإنّها تستدعي طريقة getTargetPreloadStatus() في عنصر التحكّم في الحالة لمعرفة مقدار المحتوى المطلوب تحميله. يمكن لعنصر التحكّم في الحالة الردّ بأحد رموز الحالة التالية:

  • STAGE_SPECIFIED_RANGE_LOADED: على أداة إدارة التحميل المسبق تحميل المحتوى من موضع البدء المحدّد ولمدة محدّدة (بالملّي ثانية).
  • STAGE_TRACKS_SELECTED: على أداة إدارة التحميل المسبق تحميل معلومات مسار المحتوى ومعالجتها، واختيار المسارات. يجب ألا تبدأ أداة إدارة التحميل المسبق في تحميل المحتوى بعد.
  • STAGE_SOURCE_PREPARED: على أداة إدارة التحميل المسبق إعداد مصدر المحتوى. على سبيل المثال، إذا كانت البيانات الوصفية للمحتوى في ملف بيان منفصل، قد تجلب أداة إدارة التحميل المسبق هذا البيان وتحلّله.
  • null: على أداة إدارة التحميل المسبق عدم تحميل أي محتوى أو بيانات وصفية لملف الوسائط هذا.

عليك وضع استراتيجية لتحديد مقدار المحتوى المطلوب تحميله لكل ملف وسائط. في هذا المثال، يتم تحميل المزيد من المحتوى للملفات الأقرب إلى الملف الذي يتم تشغيله حاليًا. إذا كان المستخدم يشغّل محتوى بالفهرس n، يعرض عنصر التحكّم الرموز التالية:

  • الفهرس n+1 (ملف الوسائط التالي): تحميل 3000 ملّي ثانية (3 ثوانٍ) من موضع البدء التلقائي
  • الفهرس n-1 (ملف الوسائط السابق): تحميل 1000 ملّي ثانية (ثانية واحدة) من موضع البدء التلقائي
  • ملفات الوسائط الأخرى في النطاق 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 إلى أداة إنشاء أداة إدارة التحميل المسبق عند إنشائها.
  • يحتوي currentPlayingIndex على فهرس أي ملف وسائط يتم تشغيله حاليًا. ومهمة التطبيق هي إبقاء هذه القيمة محدّثة.
  • عندما تكون أداة إدارة التحميل المسبق جاهزة لتحميل المحتوى، فإنّها تستدعي getTargetPreloadStatus وتمرّر معلومات الترتيب التي حدّدتها لملف الوسائط المقابل. في حالة DefaultPreloadManager، تكون معلومات الترتيب هذه عددًا صحيحًا يحدّد موضع الملف في لوحة العرض الدوّارة. تختار الطريقة الرمز الذي سيتم عرضه من خلال مقارنة هذا الفهرس بفهرس الملف الذي تم اختياره حاليًا.

إنشاء أداة إدارة التحميل المسبق

لإنشاء أداة إدارة التحميل المسبق، تحتاج إلى DefaultPreloadManager.Builder. يتم ضبط أداة الإنشاء هذه باستخدام السياق الحالي وعنصر التحكّم في حالة التحميل المسبق المستهدَفة في التطبيق. توفّر أداة الإنشاء أيضًا طرقًا ضابطة يمكنك استخدامها لضبط المكوّنات المخصّصة لأداة إدارة التحميل المسبق.

بالإضافة إلى استخدام أداة الإنشاء لإنشاء أداة إدارة التحميل المسبق، ستستخدمها أيضًا لـ إنشاء ExoPlayer الكائنات التي يستخدمها تطبيقك لتشغيل المحتوى.

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

نقاط أساسية حول الرمز