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

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

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

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

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

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

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

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

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

preloadManager.remove(mediaItem)

מידע חשוב על הקוד

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

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

preloadManager.release()

preloadManager.release()

מידע חשוב על הקוד

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