2015-08-11 10 views
5

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!

cevap

5

Bu sızıntı için geçici bir çözüm yolu var mı?

Application tekil üzerinde getSystemService() numaralı telefonu arayabilirsiniz. Yani bunun yerine:

getSystemService(CAMERA_SERVICE) 

istersek: değerlendirmeleriniz doğrudur

getApplicationContext().getSystemService(CAMERA_SERVICE) 

, o zaman bu çevrede her zaman mevcut Application tek, bağlı olduğu bu ek başvurular neden olur senin süreci. Etkin bir şekilde "önceden sızdırılmış" ve daha fazla referans göstererek daha fazla sızdıramazsınız.

+0

Aynı cevabı gönderecektim :) –

+0

Mükemmel fikir! ÇALIŞIYOR bir cazibe gibi :-) – DoDo

1

Bu, L MR1'de giderilen bir Android hatadır. Temel olarak, CameraManager, oluşturulduğu içeriğe bir referansı muhafaza etti ve daha sonra kamera servisine bağlandı. Bu bağlantı kamera yöneticisi örneğini süresiz olarak canlı tuttu ve bu nedenle Bağlamı süresiz olarak canlı tuttu.

Bu, CameraManager nesnelerinin artık başvurulmadığında geri alınmasına izin vermek için L MR1'e sabitlenmiştir.