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

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

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

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

ניהול מצב

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

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

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

בשלב הזה, כפי שמודגם בתרשים, אפשר לעבור בין המצבים Started,‏ Paused ו-PlaybackCompleted באמצעות קריאה לשיטות כמו 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 חדש שלא תשחררו אף פעם.

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

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

מידע נוסף

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

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