این سند دو حوزه با مشکلات بالقوه را پوشش میدهد.
حالت. با "لایه رسانهای"، عملیات خاص فقط در حالتهای خاص معتبر هستند. عملیات نادرست میتواند باعث استثنا یا رفتار غیرمنتظره شود.
منابع وقتی تغییراتی در پیکربندی، مانند چرخش صفحه نمایش، ایجاد میکنید، باید یک شیء
MediaPlayerرا آزاد کنید تا منابع سیستم آزاد شود و از اتمام منابع جلوگیری شود.
مدیریت حالت
MediaPlayer مبتنی بر وضعیت است. یعنی، یک وضعیت داخلی دارد که شما باید همیشه هنگام نوشتن کد از آن آگاه باشید، زیرا برخی عملیات فقط زمانی معتبر هستند که پخشکننده در وضعیتهای خاصی باشد. اگر عملیاتی را در وضعیت اشتباه انجام دهید، سیستم ممکن است یک استثنا ایجاد کند یا باعث بروز رفتارهای نامطلوب دیگری شود.
نمودار وضعیت در مستندات کلاس MediaPlayer ، مشخص میکند که کدام متدها MediaPlayer را از یک وضعیت به وضعیت دیگر منتقل میکنند. برای مثال:
- وقتی یک
MediaPlayerجدید ایجاد میکنید، در حالت Idle قرار دارد. - شما آن را با فراخوانی
setDataSource()مقداردهی اولیه میکنید، که آن را به حالت Initialized تغییر میدهد. - شما آن را با استفاده از متد
prepare()یاprepareAsync()آماده میکنید. - وقتی
MediaPlayerآمادهسازی خود را انجام داد، وارد حالتPreparedمیشود، به این معنی که میتوانید تابعstart()را برای پخش رسانه فراخوانی کنید.
در آن مرحله، همانطور که نمودار نشان میدهد، میتوانید با فراخوانی متدهایی مانند start() ، pause() و seekTo() و موارد دیگر، بین حالتهای Started )، Paused ) و PlaybackCompleted ) حرکت کنید.
با این حال، وقتی تابع stop() را فراخوانی میکنید، توجه داشته باشید که تا زمانی که MediaPlayer را دوباره آماده نکنید، نمیتوانید تابع start() را دوباره فراخوانی کنید.
همیشه هنگام نوشتن کدی که با یک شیء MediaPlayer تعامل دارد، نمودار حالت را در نظر داشته باشید، زیرا فراخوانی متدهای آن از حالت اشتباه، یکی از دلایل رایج بروز اشکالات است.
مدیا پلیر را آزاد کنید
یک MediaPlayer میتواند منابع ارزشمند سیستم را مصرف کند. بنابراین، شما همیشه باید اقدامات احتیاطی بیشتری را انجام دهید تا مطمئن شوید که بیش از حد لازم به یک نمونه MediaPlayer وابسته نیستید. وقتی کارتان با آن تمام شد، همیشه باید تابع release() را فراخوانی کنید تا مطمئن شوید که منابع سیستمی اختصاص داده شده به آن به درستی آزاد شدهاند.
برای مثال، اگر از MediaPlayer استفاده میکنید و activity شما فراخوانی به onStop() دریافت میکند، باید MediaPlayer را رها کنید، زیرا نگه داشتن آن در حالی که activity شما با کاربر در تعامل نیست، منطقی نیست (مگر اینکه در حال پخش رسانه در پسزمینه باشید که در بخش بعدی مورد بحث قرار میگیرد).
وقتی فعالیت شما از سر گرفته یا دوباره شروع میشود، طبیعتاً باید یک MediaPlayer جدید ایجاد کنید و قبل از از سرگیری پخش، دوباره آن را آماده کنید.
در اینجا نحوهی آزادسازی و سپس لغو MediaPlayer مدیا (MediaPlayer) را توضیح میدهیم:
کاتلین
mediaPlayer?.release()
mediaPlayer = null
جاوا
mediaPlayer.release();
mediaPlayer = null;
As an example, consider the problems that arise if you forget to release the MediaPlayer when your activity stops, but create a new one when the activity starts again. When the user changes the screen orientation (or changes the device configuration in another way), the system restarts the activity by default. You might quickly consume all of the system resources as the user rotates the device back and forth between portrait and landscape, because at each orientation change, you create a new MediaPlayer that you never release.
برای اطلاعات بیشتر در مورد راهاندازی مجدد در زمان اجرا، به بخش مدیریت تغییرات در زمان اجرا مراجعه کنید.
شاید از خود بپرسید که اگر بخواهید پخش «رسانه پسزمینه» را حتی زمانی که کاربر از اکتیویتی شما خارج میشود ادامه دهید، دقیقاً مانند رفتاری که برنامه موسیقی داخلی دارد، چه اتفاقی میافتد. در این حالت، آنچه شما نیاز دارید یک MediaPlayer است که توسط یک سرویس کنترل میشود، همانطور که در بخش بعدی مورد بحث قرار خواهد گرفت.
بیشتر بدانید
Jetpack Media3 راهکار پیشنهادی برای پخش رسانه در برنامه شماست. درباره آن بیشتر بخوانید .
این صفحات موضوعات مربوط به ضبط، ذخیره و پخش صدا و تصویر را پوشش میدهند: