בדף הזה נסביר איך ליצור DefaultPreloadManager, שמעמיס מראש תוכן מדיה לאפליקציה על סמך האסטרטגיה שתבחרו.
מנהלי טעינה מראש שמבוססים על המחלקה המופשטת BasePreloadManager מאפשרים לדרג את התוכן לפי הקריטריונים שתבחרו. במסמך הזה מוסבר איך להשתמש במחלקת הנגזרת DefaultPreloadManager, שבה כל פריט מדיה מדורג באמצעות מספר שלם שמייצג את המיקום שלו ברשימה (לדוגמה, המיקום שלו בקרוסלת סרטונים). מנהל הטעינה מראש מתעדף את טעינת הפריטים לפי מידת הקרבה שלהם לפריט שהמשתמש מפעיל כרגע. כך, אם משתמש עובר לפריט אחר, הפריט החדש יכול להתחיל לפעול מיד.
תהליך היצירה של מופע של DefaultPreloadManager כולל שלושה שלבים:
- מגדירים
TargetPreloadStatusControlשהכלי לניהול טעינה מראש יכול לשלוח אליו שאילתה כדי לגלות אם פריט המדיה מוכן לטעינה וכמה לטעון. - יוצרים את ה-builder שבו תשתמשו כדי ליצור את מנהל הטעינה מראש, וכדי ליצור את אובייקטים של
ExoPlayerבאפליקציה. - משתמשים בכלי ליצירת preload כדי ליצור את מנהל הטעינה מראש על ידי קריאה ל-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.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.
הכלי הזה מוגדר עם ההקשר הנוכחי והבקרה על סטטוס הטעינה מראש של האפליקציה. בנוסף, הכלי לבנייה מספק שיטות setter שבהן אפשר להשתמש כדי להגדיר את הרכיבים המותאמים אישית של מנהל הטעינה מראש.
בנוסף לשימוש בכלי ליצירת מנהל הטעינה מראש, תשתמשו בו גם כדי ליצור את אובייקטים ExoPlayer שהאפליקציה משתמשת בהם כדי להפעיל את התוכן.
val targetPreloadStatusControl = MyTargetPreloadStatusControl() val preloadManagerBuilder = DefaultPreloadManager.Builder(context, targetPreloadStatusControl) val preloadManager = preloadManagerBuilder.build()
מידע חשוב על הקוד
-
MyTargetPreloadStatusControlהיא הכיתה שהגדרתם במאמר יצירת אמצעי בקרה לסטטוס טעינה מראש של יעד. - תשתמשו באותו
DefaultPreloadManager.Builderכדי ליצור את האובייקטים שלExoPlayerשיפעילו תוכן שמנוהל על ידי מנהל הטעינה מראש.