ניהול והפעלה של תוכן

בדף הזה מוסבר איך להשתמש בכלי לניהול טעינה מראש כדי לנהל תוכן וידאו. שימוש במנהל טרום-טעינה יכול לשפר את חוויית המשתמש. כשהמשתמש עובר מפריט מדיה אחד לפריט אחר, ההפעלה מתחילה מהר יותר כי המנהל כבר טען חלק מהתוכן.

בדף הזה מפורטים הנושאים הבאים:

הוספת פריטי מדיה למנהל הטעינה מראש

צריך להודיע לכלי לניהול טעינה מראש על כל פריט מדיה שהוא יעקוב אחריו. לדוגמה, אם באפליקציה יש קרוסלה של סרטונים, צריך להוסיף את הסרטונים האלה למנהל הטעינה מראש. בהתאם לתרחיש השימוש, יכול להיות שתוסיפו את כל הסרטונים או רק את הסרטונים שקרובים לסרטון שמופעל כרגע. אפשר גם להוסיף פריטים חדשים למנהל הטעינה מראש בהמשך.

הוספת פריטי המדיה לא גורמת למנהל הטעינה מראש להתחיל לטעון את התוכן. כדי להפעיל את הטעינה מראש, צריך לבטל את התוקף של העדיפויות במנהל הטעינה מראש.

val initialMediaItems = pullMediaItemsFromService(/* count= */ 20);
for (index in 0 until initialMediaItems.size) {
  preloadManager.add(initialMediaItems.get(index), /* rankingData= */ index)
}
// items aren't actually loaded yet! need to call invalidate() after this

נקודות עיקריות לגבי הקוד

  • בקטע הקוד הזה מוצג איך מאכלסים את הכלי לניהול טעינה מראש אחרי שיוצרים אותו. אפשר גם להתקשר אל add() כדי להוסיף פריטים למנהל טעינה מראש קיים ומאוכלס.
  • בקטע הקוד הזה, pullMediaItemsFromService() היא הלוגיקה של האפליקציה לאחזור רשימת התוכן להפעלה. הקוד קורא לשיטה הזו כדי לאחזר רשימה של עד 20 פריטים.
  • preloadManager הוא DefaultPreloadManager שנוצר ב-Create a DefaultPreloadManager. הקוד קורא לשיטה add() של חשבון הניהול כדי להוסיף כל פריט לקרוסלה.
  • rankingData הוא ערך שמנהל הטעינה מראש משתמש בו כדי לקבוע את העדיפות של כל פריט מדיה. במקרה של DefaultPreloadManager, ‏ rankingData הוא מספר שלם <0x0A>שמייצג את המיקום של הפריט בקרוסלה. מנהל הטעינה מראש קובע את העדיפות לפי המרחק של כל פריט מהפריט שמופעל כרגע.

ביטול התוקף של העדיפויות בכלי לניהול טעינה מראש

כדי להפעיל את הכלי לניהול טעינה מראש של תוכן, צריך לקרוא לפונקציה 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)
}
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 הוא Media3 ExoPlayer שבו האפליקציה משתמשת כדי להפעיל את התוכן. צריך ליצור את הנגן הזה על ידי קריאה ל-DefaultPreloadManager.Builder.buildExoPlayer() באותו אובייקט builder שבו השתמשתם כדי ליצור את מנהל הטעינה מראש.
  • כשהמשתמש עובר לפריט מדיה חדש, האפליקציה קוראת ל-getMediaSource() כדי לקבל את מקור המדיה ממנהל הטעינה מראש. צריך להשתמש ב-mediaItem שכבר הוספתם לכלי לניהול טעינה מראש. זה בסדר אם מנהל הטעינה מראש עדיין לא התחיל לטעון את התוכן. במקרה כזה, הוא מחזיר MediaSource ללא נתונים שנטענו מראש. לדוגמה, זה יכול לקרות אם המשתמש עובר פתאום קדימה ברצף התמונות.
  • אחרי שהמשתמש מפעיל את פריט המדיה החדש, צריך להתקשר אל setCurrentPlayingIndex כדי להודיע למנהל הטעינה מראש איפה בגלגל הקרוסלה נמצא הפריט החדש. מנהל הטעינה מראש צריך את המידע הזה כדי לתעדף את הטעינה של הפריט הבא. אחרי שמעדכנים את האינדקס הנוכחי, קוראים ל-invalidate() כדי שמנהל הטעינה מראש יקבע מחדש את העדיפות של כל פריט.

הסרת פריטים ממנהל הטעינה מראש

כדי לשמור על יעילות מנהל הטעינה מראש, כדאי להסיר פריטים שמנהל הטעינה מראש לא צריך לעקוב אחריהם יותר. אפשר גם להסיר פריטים שעדיין נמצאים בקרוסלה, אבל רחוקים מהמיקום הנוכחי של המשתמש. לדוגמה, יכול להיות שתחליטו שאם פריט נמצא במרחק של יותר מ-15 פריטים ממה שהמשתמש צופה בו, אין צורך לטעון אותו מראש. במקרה כזה, תסירו פריטים כשהם יתרחקו עד כדי כך. אם המשתמש יתקרב שוב לפריטים שהוסרו, תמיד תוכלו להוסיף אותם מחדש.

preloadManager.remove(mediaItem)

נקודות עיקריות לגבי הקוד

שחרור מנהל הטעינה מראש כשמסיימים להשתמש בו

כשאין יותר צורך במנהל הטעינה מראש, צריך לשחרר אותו כדי לפנות את המשאבים שלו. חשוב במיוחד לשחרר את ה-WakeLock כשפעילות נהרסת.

preloadManager.release()

נקודות עיקריות לגבי הקוד

  • אסור לבצע קריאה לאף אחת מהשיטות של האובייקט אחרי שמשחררים אותו.
  • אם אתם צריכים ליצור עוד מנהל טעינה מראש, אתם יכולים ליצור DefaultPreloadManager.Builder חדש ולהשתמש בו כדי ליצור את DefaultPreloadManager. אל תנסו לעשות שימוש חוזר בכלי הישן לבניית אתרים.