MediaPlayer durumunu ve kaynaklarını yönetme

Bu dokümanda, olası tuzakların bulunduğu iki alan ele alınmaktadır.

  • Eyalet. "Medialayer" ile belirli işlemler yalnızca belirli durumlarda geçerlidir. Yanlış işlemler istisnalara veya beklenmedik davranışlara neden olabilir.

  • Kaynaklar Ekran döndürme gibi yapılandırma değişiklikleri yaptığınızda sistem kaynaklarını boşaltmak ve kaynak tükenmesini önlemek için bir MediaPlayer nesnesi bırakmanız gerekir.

Durumu yönetme

MediaPlayer duruma bağlıdır. Yani, belirli işlemler yalnızca oynatıcı belirli durumlardayken geçerli olduğundan, kodunuzu yazarken her zaman dikkate almanız gereken bir dahili durumu vardır. Yanlış durumdayken bir işlem yaparsanız sistem bir istisna oluşturabilir veya istenmeyen başka davranışlara neden olabilir.

MediaPlayer sınıf dokümanlarında yer alan durum şeması, MediaPlayer'u bir durumdan diğerine hangi yöntemlerin taşıdığını açıklığa kavuşturur. Örnek:

  • Yeni bir MediaPlayer oluşturduğunuzda bu öğe Boş durumundadır.
  • setDataSource() çağrısı yaparak başlatırsınız. Bu çağrı, Initialized durumuna geçer.
  • prepare() veya prepareAsync() yöntemini kullanarak hazırlarsınız.
  • MediaPlayer hazırlandığında Prepared durumuna girer. Bu durumda, medyayı oynatması için start() işlevini çağırabilirsiniz.

Bu noktada, şemada gösterildiği gibi start(), pause() ve seekTo() gibi yöntemler çağırarak Started, Paused ve PlaybackCompleted durumları arasında geçiş yapabilirsiniz.

Ancak stop()'i aradığınızda MediaPlayer'ı tekrar hazırlayana kadar start()'i tekrar çağıramayacağınızı unutmayın.

MediaPlayer nesnesi ile etkileşime geçen kod yazarken her zaman durum diyagramını göz önünde bulundurun. Çünkü yöntemlerini yanlış durumdan çağırmanız, hataların yaygın bir nedenidir.

MediaPlayer'ı serbest bırakma

MediaPlayer değerli sistem kaynaklarını tüketebilir. Bu nedenle, bir MediaPlayer örneğini gereğinden uzun süre kullanmamak için her zaman ek önlemler almalısınız. İşiniz bittiğinde, ayrılan sistem kaynaklarının düzgün şekilde serbest bırakıldığından emin olmak için her zaman release() işlevini çağırmanız gerekir.

Örneğin, bir MediaPlayer kullanıyorsanız ve etkinliğiniz onStop() çağrısı alırsa MediaPlayer'ı bırakmanız gerekir. Çünkü etkinliğiniz kullanıcıyla etkileşimde bulunmadığı sürece MediaPlayer'ı tutmanın pek bir anlamı yoktur (arka planda medya oynatmıyorsanız, bu konu bir sonraki bölümde ele alınmaktadır).

Etkinliğiniz devam ettirildiğinde veya yeniden başlatıldığında, oynatmaya devam etmeden önce yeni bir MediaPlayer oluşturmanız ve hazırlamanız gerekir.

MediaPlayer dosyanızı nasıl yayınlayacağınız ve ardından nasıl geçersiz kılacağınız aşağıda açıklanmıştır:

Kotlin

mediaPlayer?.release()
mediaPlayer = null

Java

mediaPlayer.release();
mediaPlayer = null;

Örneğin, etkinliğiniz durduğunda MediaPlayer değerini bırakmayı unutursanız ancak etkinlik tekrar başladığında yeni bir değer oluşturursanız ortaya çıkabilecek sorunları düşünün. Kullanıcı ekran yönünü değiştirdiğinde (veya cihaz yapılandırmasını başka bir şekilde değiştirdiğinde) sistem varsayılan olarak etkinliği yeniden başlatır. Kullanıcı cihazı dikey ve yatay arasında ileri geri döndürdüğünde tüm sistem kaynaklarını hızlıca tüketebilirsiniz. Bunun nedeni, her yön değişikliğinde hiç bırakmadığınız yeni bir MediaPlayer oluşturmanızdır.

Çalışma zamanı yeniden başlatmaları hakkında daha fazla bilgi için Çalışma zamanı değişikliklerini ele alma başlıklı makaleyi inceleyin.

Kullanıcı etkinliğinizden ayrılsa bile "arka planda medya" oynatmaya devam etmek isterseniz ne olacağını merak ediyor olabilirsiniz. Bu durum, yerleşik Müzik uygulamasının davranışıyla neredeyse aynıdır. Bu durumda, bir sonraki bölümde açıklandığı gibi bir Hizmet tarafından kontrol edilen bir MediaPlayer'e ihtiyacınız vardır.

Daha fazla bilgi

Uygulamanızda medya oynatma için önerilen çözüm Jetpack Media3'tür. Bu konu hakkında daha fazla bilgi edinin.

Bu sayfalarda ses ve video kaydetme, depolama ve oynatma ile ilgili konular ele alınmaktadır: