setHasStableId
Bayrak kullanımının sorununuzu çözüp çözmeyeceğinden pek emin değilim . Sağladığınız bilgilere dayanarak, performans sorununuz bir bellek sorunuyla ilgili olabilir. Kullanıcı arayüzü ve bellek açısından uygulamanızın performansı oldukça ilişkilidir.
Geçen hafta uygulamamın bellek sızdırdığını keşfettim. Bunu keşfettim çünkü uygulamamı 20 dakika kullandıktan sonra kullanıcı arayüzünün gerçekten yavaş çalıştığını fark ettim. Bir aktiviteyi kapatmak / açmak veya RecyclerView'ı bir grup öğe ile kaydırmak gerçekten yavaştı. Bazı kullanıcılarımı http://flowup.io/ kullanarak üretimde izledikten sonra şunu buldum:
Çerçeve süresi gerçekten çok yüksekti ve saniyedeki kare sayısı gerçekten çok düşüktü. Bazı karelerin işlenmesi için yaklaşık 2 saniye gerektiğini görebilirsiniz: S.
Bu kötü çerçeve süresine / fps'ye neyin neden olduğunu anlamaya çalışıyorum, burada görebileceğiniz gibi bir bellek sorunum olduğunu keşfettim:
Ortalama bellek tüketimi aynı anda 15MB'ye yakın olduğunda bile uygulama kare düşürüyordu.
UI sorununu böyle keşfettim. Uygulamamda çok sayıda çöp toplayıcı olayına neden olan bir bellek sızıntısı vardı ve bu, kötü UI performansına neden oluyordu çünkü Android sanal makinesi, uygulamamı her karede bellek toplamak için durdurmak zorunda kaldı.
Koda baktığımda, Android Choreographer örneğinden bir dinleyicinin kaydını iptal etmediğim için özel bir görünümde sızıntı yaşadım. Düzeltmeyi yayınladıktan sonra her şey normale döndü :)
Uygulamanız bir bellek sorunu nedeniyle çerçeve atıyorsa, iki yaygın hatayı incelemelisiniz:
Uygulamanızın saniyede birden çok kez çağrılan bir yöntem içinde nesneleri ayırıp ayırmadığını inceleyin. Hatta bu tahsis, uygulamanızın yavaşladığı farklı bir yerde yapılabilir. Geri dönüşümcü görünüm tutucunuzdaki onBindViewHolder üzerinde bir onDraw özel görünüm yöntemi içinde bir nesnenin yeni örneklerini oluşturmak bir örnek olabilir. Uygulamanızın Android SDK'ya bir örnek kaydedip kaydetmediğini ancak yayınlamadığını inceleyin. Bir dinleyicinin bir veri yolu olayına kaydedilmesi de olası sızıntı olabilir.
Sorumluluk Reddi: Uygulamamı izlemek için kullandığım araç geliştirme aşamasındadır. Bu araca erişimim var çünkü geliştiricilerden biriyim :) Bu araca erişmek istiyorsanız yakında bir beta sürümünü yayınlayacağız! Web sitemize katılabilirsiniz: http://flowup.io/ .
Farklı araçlar kullanmak istiyorsanız kullanabilirsiniz: traveview, dmtracedump, systrace veya Android Studio'ya entegre Andorid performans monitörü. Ancak bu araçların, kullanıcı cihazlarınızın veya Android işletim sistemi kurulumlarınızın geri kalanını değil, bağlı cihazınızı izleyeceğini unutmayın.