יצירה והגדרה של DefaultPreloadManager

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

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

תהליך היצירה של מופע של DefaultPreloadManager כולל שלושה שלבים:

  • מגדירים TargetPreloadStatusControl שהכלי לניהול טעינה מראש יכול לשלוח לו שאילתה כדי לגלות אם פריט המדיה מוכן לטעינה וכמה לטעון.
  • יוצרים את ה-builder שבו ישתמשו כדי ליצור את מנהל הטעינה מראש, וכדי ליצור את אובייקטים ExoPlayer של האפליקציה.
  • משתמשים בכלי ליצירת מנהל הטעינה מראש על ידי קריאה ל-method‏ build() של הכלי.

יצירת אמצעי בקרה למצב הטעינה מראש של יעד

כשיוצרים את DefaultPreloadManager.Builder, מעבירים לו אובייקט target preload status control שאתם מגדירים. האובייקט הזה מטמיע את הממשק TargetPreloadStatusControl. כשהכלי לניהול טעינה מראש מתכונן לטעון מראש מדיה, הוא קורא לשיטה getTargetPreloadStatus() של אמצעי הבקרה של הסטטוס כדי לגלות כמה תוכן לטעון. הפקד של הסטטוס יכול להשיב עם אחד מקודי הסטטוס הבאים:

  • STAGE_SPECIFIED_RANGE_LOADED: מנהל הטעינה מראש צריך לטעון את התוכן ממיקום ההתחלה שצוין למשך הזמן שצוין (באלפיות השנייה).
  • STAGE_TRACKS_SELECTED: מנהל הטעינה מראש צריך לטעון ולעבד את המידע של רצועת התוכן ולבחור את הרצועות. מנהל הטעינה מראש לא אמור להתחיל לטעון את התוכן עדיין.
  • STAGE_SOURCE_PREPARED: מנהל הטעינה מראש צריך להכין את מקור התוכן. לדוגמה, אם המטא-נתונים של התוכן נמצאים בקובץ מניפסט נפרד, יכול להיות שמנהל הטעינה מראש יאחזר וינתח את המניפסט הזה.
  • null: מנהל הטעינה מראש לא צריך לטעון תוכן או מטא-נתונים עבור פריט המדיה הזה.

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

  • אינדקס n+1 (פריט המדיה הבא): טעינה של 3,000 אלפיות השנייה (3 שניות) מנקודת ההתחלה שמוגדרת כברירת מחדל
  • אינדקס n-1 (פריט המדיה הקודם): טעינה של 1,000 אלפיות השנייה (שנייה אחת) מנקודת ההתחלה שמוגדרת כברירת מחדל
  • פריטי מדיה אחרים בטווח n-2 עד n+2: מקש Return PreloadStatus.TRACKS_SELECTED
  • פריטי מדיה אחרים בטווח n-4 עד n+4: מקש Return PreloadStatus.SOURCE_PREPARED
  • לכל שאר פריטי המדיה, מחזירים את הערך null
class MyTargetPreloadStatusControl(
  currentPlayingIndex: Int = C.INDEX_UNSET
): 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.TRACKS_SELECTED
    } else if (abs(index - currentPlayingIndex) <= 4) {
      // return a PreloadStatus that is labelled by STAGE_SOURCE_PREPARED
      return DefaultPreloadManager.PreloadStatus.SOURCE_PREPARED
    }
    return null
  }
}

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

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

יצירת כלי לניהול טעינה מראש

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

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

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

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