ניהול המצב והמשאבים של MediaPlayer

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

  • State ב-Medialayer, פעולות מסוימות תקפות רק במצבים ספציפיים. פעולות שגויות עלולות לגרום לחריגות או להתנהגות לא צפויה.

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

ניהול המצב

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

תרשים המצבים במסמכי העזרה של הכיתה MediaPlayer מבהיר אילו שיטות מעבירות את MediaPlayer ממצב אחד למצב אחר. לדוגמה:

  • כשיוצרים MediaPlayer חדש, הוא נמצא בסטטוס Idle.
  • כדי לאתחל אותו, קוראים ל-setDataSource(), והוא עובר למצב Initialized.
  • מכינים אותו באמצעות ה-method‏ prepare() או prepareAsync().
  • כשה-MediaPlayer מסיים את ההכנה, הוא עובר למצב Prepared, כלומר אפשר להפעיל את ההפעלה של המדיה באמצעות start().

בשלב הזה, כפי שמוצג בתרשים, אפשר לעבור בין המצבים Started,‏ Paused ו-PlaybackCompleted באמצעות קריאה ל-methods כמו start(),‏ pause() ו-seekTo(), בין היתר.

עם זאת, חשוב לזכור שאחרי שמתקשרים למספר stop(), אי אפשר להתקשר שוב למספר start() עד שמכינים שוב את MediaPlayer.

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

שחרור MediaPlayer

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

לדוגמה, אם אתם משתמשים ב-MediaPlayer והפעילות שלכם מקבלת קריאה ל-onStop(), עליכם לשחרר את MediaPlayer כי אין טעם להחזיק בו בזמן שהפעילות לא יוצרת אינטראקציה עם המשתמש (אלא אם אתם מפעילים מדיה ברקע, כפי שמתואר בקטע הבא).

כשהפעילות תתחדש או תתחיל מחדש, תצטרכו ליצור MediaPlayer חדש ולהכין אותו מחדש לפני שתמשיכו את ההפעלה.

כך משחררים ואז מבטלים את MediaPlayer:

Kotlin

mediaPlayer?.release()
mediaPlayer = null

Java

mediaPlayer.release();
mediaPlayer = null;

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

מידע נוסף על הפעלות מחדש בסביבת זמן הריצה זמין במאמר טיפול בשינויים בסביבת זמן הריצה.

יכול להיות שאתם תוהים מה קורה אם רוצים להמשיך להפעיל 'מדיה ברקע' גם כשהמשתמש יוצא מהפעילות, בדומה לאופן שבו פועלת אפליקציית Music המובנית. במקרה כזה, צריך MediaPlayer שנשלט על ידי שירות, כפי שמתואר בקטע הבא.

מידע נוסף

Jetpack Media3 הוא הפתרון המומלץ להפעלת מדיה באפליקציה. מידע נוסף

בדפים האלה מפורטים נושאים שקשורים להקלטה, לאחסון ולהפעלה של אודיו ווידאו: