בדף הזה מוסבר איך להשתמש בכלי לניהול טעינה מראש כדי לנהל תוכן וידאו. שימוש במנהל טרום-טעינה יכול לשפר את חוויית המשתמש. כשהמשתמש עובר מפריט מדיה אחד לפריט אחר, ההפעלה מתחילה מהר יותר כי המנהל כבר טען חלק מהתוכן.
בדף הזה מפורטים הנושאים הבאים:
- הוספת פריטי מדיה למנהל הטעינה מראש
- ביטול התוקף של העדיפויות במנהל הטעינה מראש
- אחזור והפעלה של מדיה
- הסרת פריטים מהכלי לניהול טעינה מראש
- איך משחררים את מנהל הטעינה מראש כשמסיימים להשתמש בו
הוספת פריטי מדיה למנהל הטעינה מראש
צריך להודיע לכלי לניהול טעינה מראש על כל פריט מדיה שהוא יעקוב אחריו. לדוגמה, אם באפליקציה יש קרוסלה של סרטונים, צריך להוסיף את הסרטונים האלה למנהל הטעינה מראש. בהתאם לתרחיש השימוש, יכול להיות שתוסיפו את כל הסרטונים או רק את הסרטונים שקרובים לסרטון שמופעל כרגע. אפשר גם להוסיף פריטים חדשים למנהל הטעינה מראש בהמשך.
הוספת פריטי המדיה לא גורמת למנהל הטעינה מראש להתחיל לטעון את התוכן. כדי להפעיל את הטעינה מראש, צריך לבטל את התוקף של העדיפויות במנהל הטעינה מראש.
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 aDefaultPreloadManager
. הקוד קורא לשיטה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
הוא Media3ExoPlayer
שבו האפליקציה משתמשת כדי להפעיל את התוכן. צריך ליצור את הנגן הזה על ידי קריאה ל-DefaultPreloadManager.Builder.buildExoPlayer()
באותו אובייקט builder שבו השתמשתם כדי ליצור את מנהל הטעינה מראש. - כשהמשתמש עובר לפריט מדיה חדש, האפליקציה קוראת ל-
getMediaSource()
כדי לקבל את מקור המדיה ממנהל הטעינה מראש. צריך להשתמש ב-mediaItem
שכבר הוספתם לכלי לניהול טעינה מראש. זה בסדר אם מנהל הטעינה מראש עדיין לא התחיל לטעון את התוכן. במקרה כזה, הוא מחזירMediaSource
ללא נתונים שנטענו מראש. לדוגמה, זה יכול לקרות אם המשתמש עובר פתאום קדימה ברצף התמונות. - אחרי שהמשתמש מפעיל את פריט המדיה החדש, צריך להתקשר אל
setCurrentPlayingIndex
כדי להודיע למנהל הטעינה מראש איפה בגלגל הקרוסלה נמצא הפריט החדש. מנהל הטעינה מראש צריך את המידע הזה כדי לתעדף את הטעינה של הפריט הבא. אחרי שמעדכנים את האינדקס הנוכחי, קוראים ל-invalidate()
כדי שמנהל הטעינה מראש יקבע מחדש את העדיפות של כל פריט.
הסרת פריטים ממנהל הטעינה מראש
כדי לשמור על יעילות מנהל הטעינה מראש, כדאי להסיר פריטים שמנהל הטעינה מראש לא צריך לעקוב אחריהם יותר. אפשר גם להסיר פריטים שעדיין נמצאים בקרוסלה, אבל רחוקים מהמיקום הנוכחי של המשתמש. לדוגמה, יכול להיות שתחליטו שאם פריט נמצא במרחק של יותר מ-15 פריטים ממה שהמשתמש צופה בו, אין צורך לטעון אותו מראש. במקרה כזה, תסירו פריטים כשהם יתרחקו עד כדי כך. אם המשתמש יתקרב שוב לפריטים שהוסרו, תמיד תוכלו להוסיף אותם מחדש.
preloadManager.remove(mediaItem)
נקודות עיקריות לגבי הקוד
- אם רוצים להסיר את כל הפריטים ממנהל הטעינה מראש, אפשר לקרוא ל-
reset()
במקום ל-remove()
. הגישה הזו שימושית אם אתם צריכים לשנות את כל הפריטים בקרוסלה. במקרה כזה, אחרי שמסירים את הפריטים, צריך להוסיף פריטים חדשים למנהל הטעינה מראש ואז לבטל את התוקף של העדיפויות במנהל הטעינה מראש.
שחרור מנהל הטעינה מראש כשמסיימים להשתמש בו
כשאין יותר צורך במנהל הטעינה מראש, צריך לשחרר אותו כדי לפנות את המשאבים שלו. חשוב במיוחד לשחרר את ה-WakeLock כשפעילות נהרסת.
preloadManager.release()
נקודות עיקריות לגבי הקוד
- אסור לבצע קריאה לאף אחת מהשיטות של האובייקט אחרי שמשחררים אותו.
- אם אתם צריכים ליצור עוד מנהל טעינה מראש, אתם יכולים ליצור
DefaultPreloadManager.Builder
חדש ולהשתמש בו כדי ליצור אתDefaultPreloadManager
. אל תנסו לעשות שימוש חוזר בכלי הישן לבניית אתרים.