במסמך הזה מפורטים שני תחומים עם מלכודות פוטנציאליות.
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 הוא הפתרון המומלץ להפעלת מדיה באפליקציה. מידע נוסף
בדפים האלה מפורטים נושאים שקשורים להקלטה, לאחסון ולהפעלה של אודיו ווידאו: