Aynı zamanda ben de reported olan Android 5.x Camera2 API'da bir bellek sızıntısı buldum. Sorun, LEGACY
modunda uygulanan Camera2 API'sine sahip olan Android Lollipop aygıtını kullandığınız zamandır. Bu tür cihazlarda, context.getSystemService(Context.CAMERA_SERVICE)
numaralı telefonun aranması, context
'un toplanmasına neden olur ve böylece çöp toplanmayacaktır.context.getSystemService'de (Context.CAMERA_SERVICE) bellek sızıntısı nasıl önlenir?
Bu context
, birden çok kez başlatılan etkinliğinizse, hiç bir zaman çöp toplanmayan etkinliğinizin düzinelerce örneğine asılı referanslarla sonuçlanabilirsiniz. o FULL
modunda Camera2 API uygular Samsung Galaxy S6 olmaz ise
mesele, sadece Camera2 API LEGACY
modu (örn HTC One M8, Samsung Galaxy S4) uygulanan sahip Lollipop cihazlarda ortaya çıkar görünmektedir.
Sorunu göstermek için, bir small demo app oluşturdum. Uygulama iki aktivite içerir: Birincisi, ikinci etkinliği çağıran bir düğme içerir. İkinci aktivite, CameraManager
'u alır ve ilk arkaya bakan kamera için Camera2 API desteğinin düzeyini sorgular ve sonucu ilk etkinliğe döndürür. Eğer aynı yaparsanız bu http://www.pohrani.com/f/1H/gs/4EFlHKoj/sgs4.png
gibi Main2Activity
tam 98 canlı örneklerini göreceksiniz HPROF damping sonra, düğmeye 98 kez dokunarak GC neden ve sonrasında LEGACY
modunda Camera2 API uygular uygulamayı cihazınıza çalıştırırsanız FULL
modunda Camera2 API uygular cihazda, bu sızıntıyı geçici çözüm için bir yol var mı bu http://www.pohrani.com/f/2q/bV/4srUZIJL/sgs6.png
gibi Main2Activity
0 canlı örneklerini görecek?
Bunu neden yaptığımı sorabilir miyim? Firmamızda, barcode and OCR scanning solutions ve ayrıca ünlü bir PhotoMath app geliştiriyoruz. Bu yüzden kamera ve tarama işlemini kontrol eden bir tarama aktivitemiz var. Başlarken, cihaz, Cihazın Camera2 API'sini FULL
veya LIMITED
modunda destekleyip desteklemediğini kontrol eder ve Camera2 API LEGACY
modundayken, daha iyi performans için kullanmaya çalışırsa, biz de eski kamera API'sini kullanarak kamera yönetimini kullanmayı tercih ederiz. Lollipop öncesi cihazlar.
Belirtilen bellek sızıntısı nedeniyle, SDK'mizi uygulamasına entegre eden bir istemci tarama etkinliğini başlatır, bir tarama gerçekleştirir ve sonucu alırsa, hata nedeniyle bir tarama etkinliği örneği sızacaktır. Müşteri çok fazla tarama yaparsa, bu 20 MB'den fazla bellek tüketebilir - ciddi bir sorun!
Eğer birisi bu sorun için nasıl bir çözüm bulacağını biliyorsa, sonsuza dek minnettar olacağım!
Aynı cevabı gönderecektim :) –
Mükemmel fikir! ÇALIŞIYOR bir cazibe gibi :-) – DoDo