توضّح هذه الصفحة كيفية استخدام مدير التحميل المسبق لإدارة محتوى الفيديو. باستخدام مدير التحميل المسبق، يمكنك منح المستخدم تجربة أفضل. فعندما ينتقل المستخدم من عنصر وسائط إلى آخر، يبدأ التشغيل بشكل أسرع لأنّ المدير سبق أن حمّل بعض المحتوى.
تتناول هذه الصفحة المواضيع التالية:
- إضافة عناصر وسائط إلى مدير التحميل المسبق
- إبطال الأولويات في مدير التحميل المسبق
- جلب الوسائط وتشغيلها
- إزالة العناصر من مدير التحميل المسبق
- إيقاف مدير التحميل المسبق عند الانتهاء من استخدامه
إضافة عناصر وسائط إلى مدير التحميل المسبق
عليك إعلام مدير التحميل المسبق بكل عنصر وسائط سيتتبّعه. على سبيل المثال، إذا كان تطبيقك يتضمّن منصّة عرض دوّارة للفيديوهات، عليك إضافة هذه الفيديوهات إلى مدير التحميل المسبق. استنادًا إلى حالة الاستخدام، يمكنك إضافة جميع الفيديوهات أو جميع الفيديوهات القريبة من الفيديو الذي يتم تشغيله حاليًا فقط. يمكنك أيضًا إضافة عناصر جديدة إلى مدير التحميل المسبق لاحقًا.
إنّ إضافة عناصر الوسائط لا تؤدي بحد ذاتها إلى بدء مدير التحميل المسبق في تحميل المحتوى. لبدء التحميل المسبق، عليك إبطال الأولويات في مدير التحميل المسبق.
val initialMediaItems = pullMediaItemsFromService(count = 20) for (index in 0 until initialMediaItems.size) { preloadManager.add(initialMediaItems[index], /* rankingData= */ index) } // items aren't actually loaded yet! need to call invalidate() after this
نقاط أساسية حول الرمز
- توضّح هذه المقتطفة كيفية ملء مدير التحميل المسبق في البداية بعد إنشائه. يمكنك أيضًا استدعاء
add()لإضافة عناصر إلى مدير تحميل مسبق حالي تم ملؤه. - في هذه المقتطفة،
pullMediaItemsFromService()هي منطق التطبيق لجلب قائمة المحتوى الذي سيتم تشغيله. يستدعي الرمز هذه الطريقة لجلب قائمة تضم ما يصل إلى 20 عنصرًا. preloadManagerهوDefaultPreloadManagerالذي تم إنشاؤه في إنشاءDefaultPreloadManager. يستدعي الرمز طريقةadd()لهذا المدير لإضافة كل عنصر في منصّة العرض الدوّارة.rankingDataهي قيمة يستخدمها مدير التحميل المسبق لتحديد أولوية كل عنصر وسائط. بالنسبة إلىDefaultPreloadManager، يكونrankingDataعددًا صحيحًا يمثّل موضع العنصر في منصّة العرض الدوّارة. يحدّد مدير التحميل المسبق الأولوية حسب مدى بُعد كل عنصر عن العنصر الذي يتم تشغيله حاليًا.
إبطال الأولويات في مدير التحميل المسبق
لبدء مدير التحميل المسبق في تحميل المحتوى مسبقًا، عليك استدعاء invalidate() لإعلام مدير التحميل المسبق بأنّ أولويات العناصر غير محدّثة. عليك إجراء ذلك في الحالات التالية:
- عند إضافة عناصر وسائط جديدة إلى مدير التحميل المسبق أو إزالة عناصر وسائط.
إذا كنت تضيف عدة عناصر أو تزيلها، عليك إضافة جميعها ثم استدعاء
invalidate(). - عندما ينتقل المستخدم من عنصر وسائط إلى آخر. في هذه الحالة، عليك التأكّد من تعديل فهرس التشغيل الحالي قبل استدعاء
invalidate()، كما هو موضّح في جلب المحتوى وتشغيله.
عند إبطال مدير التحميل المسبق، يستدعي
TargetPreloadStatusControl الذي أنشأته لمعرفة مقدار المحتوى
الذي يجب تحميله من كل عنصر. بعد ذلك، يتم تحميل محتوى كل عنصر بترتيب الأولوية من الأعلى إلى الأدنى.
preloadManager.invalidate()
نقاط أساسية حول الرمز
- يؤدي استدعاء
invalidate()إلى إعادة تقييم مدير التحميل المسبق لأولوية كل عنصر وسائط يعرفه. لهذا السبب، إذا كنت تُجري الكثير من التغييرات على مدير التحميل المسبق، عليك الانتهاء من إجراء التغييرات قبل استدعاءinvalidate().
جلب الوسائط وتشغيلها
عندما ينتقل المستخدم إلى عنصر وسائط جديد، عليك الحصول على عنصر الوسائط من مدير التحميل المسبق. إذا حمّل مدير التحميل المسبق أيًا من المحتوى، يتم تشغيل المحتوى بشكل أسرع مما لو لم تستخدم مدير التحميل المسبق. إذا لم يحمّل مدير التحميل المسبق محتوى من هذا العنصر بعد، يتم تشغيل المحتوى بشكل طبيعي.
// When a media item is about to display on the screen val mediaSource = preloadManager.getMediaSource(mediaItem) if (mediaSource != null) { player.setMediaSource(mediaSource) } else { // If mediaSource is null, that mediaItem hasn't been added to the preload manager // yet. So, send it directly to the player when it's about to play player.setMediaItem(mediaItem) } 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()
نقاط أساسية حول الرمز
playerهوExoPlayerفي Media3 الذي يستخدمه التطبيق لتشغيل المحتوى. عليك إنشاء هذا المشغّل من خلال استدعاءDefaultPreloadManager.Builder.buildExoPlayer()على أداة الإنشاء نفسها التي استخدمتها لإنشاء مدير التحميل المسبق.- عندما ينتقل المستخدم إلى عنصر وسائط جديد، يستدعي التطبيق
getMediaSource()للحصول على مصدر الوسائط من مدير التحميل المسبق. يجب أن يكون هذاmediaItemقد أضفته إلى مدير التحميل المسبق. لا بأس إذا لم يكن مدير التحميل المسبق قد بدأ تحميل المحتوى بعد. في هذه الحالة، يعرضMediaSourceلا يتضمّن بيانات تم تحميلها مسبقًا. على سبيل المثال، قد يحدث ذلك إذا انتقل المستخدم فجأة إلى موضع بعيد في منصّة العرض الدوّارة. - بعد أن يشغّل المستخدم عنصر الوسائط الجديد، استدعِ
setCurrentPlayingIndexلإعلام مدير التحميل المسبق بموضع العنصر الجديد في منصّة العرض الدوّارة. يحتاج مدير التحميل المسبق إلى هذه المعلومات لتحديد أولوية تحميل العنصر التالي. بعد تعديل الفهرس الحالي، استدعِinvalidate()لجعل مدير التحميل المسبق يعيد تحديد أولوية كل عنصر.
إزالة العناصر من مدير التحميل المسبق
للحفاظ على كفاءة مدير التحميل المسبق، عليك إزالة العناصر التي لم يعُد مدير التحميل المسبق بحاجة إلى تتبّعها. يمكنك أيضًا إزالة العناصر التي لا تزال في منصّة العرض الدوّارة، ولكنها بعيدة عن موضع المستخدم الحالي. على سبيل المثال، يمكنك أن تقرّر أنّه إذا كان العنصر على بُعد أكثر من 15 عنصرًا من المحتوى الذي يشاهده المستخدم، فلا داعي لتحميله مسبقًا. في هذه الحالة، عليك إزالة العناصر عندما تصبح بعيدة بهذا القدر. إذا عاد المستخدم إلى هذه العناصر التي تمت إزالتها، يمكنك دائمًا إضافتها مرة أخرى.
preloadManager.remove(mediaItem)
نقاط أساسية حول الرمز
- إذا أردت إزالة جميع العناصر من مدير التحميل المسبق، يمكنك استدعاء
reset()بدلاً منremove(). يكون هذا النهج مفيدًا إذا كنت بحاجة إلى تغيير جميع العناصر في منصّة العرض الدوّارة. في هذه الحالة، بعد إزالة العناصر، عليك إضافة عناصر جديدة إلى مدير التحميل المسبق ثم إبطال الأولويات في مدير التحميل المسبق.
إيقاف مدير التحميل المسبق عند الانتهاء من استخدامه
عندما لم تعُد بحاجة إلى مدير التحميل المسبق، عليك إيقافه لتحرير موارده. على وجه الخصوص، احرص على إيقافه عند إيقاف نشاطك.
preloadManager.release()
نقاط أساسية حول الرمز
- يجب عدم استدعاء أي من طرق الكائن بعد إيقافه.
- إذا كنت بحاجة إلى إنشاء مدير تحميل مسبق آخر، أنشئ
DefaultPreloadManager.Builderجديدًا واستخدِمه لإنشاءDefaultPreloadManager. لا تحاول إعادة استخدام أداة الإنشاء القديمة.