MediaPlayer durumunu ve kaynaklarını yönetme

Bu belgede, 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 MediaPlayer nesnesini serbest bırakmanız gerekir.

Durumu yönetme

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

MediaPlayer sınıf dokümanlarındaki durum şeması, MediaPlayer öğesini bir durumdan diğerine taşıyan yöntemleri netleştirir. Örneğin:

  • Yeni bir MediaPlayer oluşturduğunuzda bu öğe Boşta durumundadır.
  • setDataSource() işlevini çağırarak başlatırsınız. Bu işlem, durumu Initialized (Başlatıldı) olarak değiştirir.
  • prepare() veya prepareAsync() yöntemini kullanarak hazırlarsınız.
  • MediaPlayer hazırlama işlemi tamamlandığında Prepared durumuna geçer. Bu durumda, start() işlevini çağırarak medyanın oynatılmasını sağlayabilirsiniz.

Bu noktada, diyagramda gösterildiği gibi, diğerlerinin yanı sıra start(), pause() ve seekTo() gibi yöntemleri çağırarak Started, Paused ve PlaybackCompleted durumları arasında geçiş yapabilirsiniz.

Ancak stop()'ı aradığınızda MediaPlayer'ı tekrar hazırlayana kadar start()'ı tekrar arayamayacağınızı unutmayın.

Bir MediaPlayer nesnesiyle etkileşimde bulunan kod yazarken her zaman durum şemasını göz önünde bulundurun. Çünkü yöntemlerinin yanlış durumdan çağrılması, hataların yaygın bir nedenidir.

MediaPlayer'ı serbest bırakma

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

Örneğin, bir MediaPlayer kullanıyorsanız ve etkinliğiniz onStop() çağrısı alıyorsa MediaPlayer öğesini serbest bırakmanız gerekir. Çünkü etkinliğiniz kullanıcıyla etkileşimde bulunmadığı sürece (bir sonraki bölümde ele alınan, arka planda medya oynatma durumu hariç) bu öğeyi tutmanın pek bir anlamı yoktur.

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

MediaPlayer'nizi nasıl yayınlayıp 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 serbest bırakmayı unutup etkinlik tekrar başladığında yeni bir MediaPlayer oluşturursanız ortaya çıkacak 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, etkinliği varsayılan olarak yeniden başlatır. Kullanıcı cihazı dikey ve yatay mod arasında ileri geri döndürdüğünde sistem kaynaklarının tamamını hızlıca tüketebilirsiniz. Bunun nedeni, her yön değişikliğinde yeni bir MediaPlayer oluşturmanız ve bunu hiç serbest bırakmamanızdır.

Çalışma zamanı yeniden başlatmaları hakkında daha fazla bilgi için Çalışma Zamanı Değişikliklerini İşleme başlıklı makaleyi inceleyin.

Kullanıcı etkinliğinizden ayrıldığında bile "arka plan medyası" oynatmaya devam etmek isterseniz ne olacağını merak ediyor olabilirsiniz. Bu, yerleşik Müzik uygulamasının davranışına benzer. Bu durumda, bir hizmet tarafından kontrol edilen bir MediaPlayer gerekir. Bu konu, bir sonraki bölümde ele alınmıştır.

Daha fazla bilgi

Jetpack Media3, uygulamanızda medya oynatma için önerilen çözümdür. Daha fazla bilgi edinin.

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