frames =16.666ms/frame Em 16ms: • Computação • Desenhar componentes na tela • Atualização de views na tela • Animações • Tempo para o GC recolher objetos
pausa Tempo upload Bitmap na GPU atualizando/enviando display list gpu ++ , CPU aguardando measure/layout - hierarquia++ Desenho - métodos desenho sobrecarregado animações - usar outra thread entre frames - usar outra thread 16ms
Loren ipsun loren loren ipsun loren favoritar compartilhar Nome Loren ipsun loren loren ipsun loren favoritar compartilhar Como você vê seu app Como Android vê seu app
layout extra • Customizar temas da aplicação • Reduzir layouts com transparência (The hidden cost of transparency) https://www.youtube.com/watch?v=wIy8g8yNhNk • Desenhar somente o que está visível para o usuário. Ex: customviews (Udacity) • ConstraintLayout https://android-developers.googleblog.com/2017/08/understanding- performance-benefits-of.html
(vazamento de memória) • Uma porção de memória que não é liberada • Está referenciada por outra instancia/objeto • A referência impede a memória de ser liberada • Todos os itens que estão ancorados à activity também sofrem leaks (adapters, views, etc)
• A activity é destruída • Outra activity é criada • Se tiver leaks na activity destruída, ela não é coletada • Parabéns: você ganhou uma activity de brinde :)
vez que a configuração muda, a activity é recriada • Se houver um leak a activity não será desalocada da memória android:configChanges= ["mcc", "mnc", "locale","touchscreen", "keyboard", "keyboardHidden","navigation", "screenLayout", "fontScale","uiMode", "orientation", "screenSize","smallestScreenSize"]
(se pergunte pelo menos 10 vezes) • Recomendado: não utilizar o contexto estático • Utilizar o contexto da aplicação • Banco de Dados, Singleton, etc • Inicialização libs (Fabric, Crashlytics, facebook)
{ @Override public void run() { image.setImageResource(R.drawable.imagem); } }, LONG_TIME); } Leak 3 - Referenciar views em classes anônimas que tem tempo de vida maior Leak Cuidado com Handlers
{ ImageView imageView = imageViewWeakReference.get(); if(imageView != null) { imageView.setImageBitmap(bitmap); } } Dica: nunca esqueça de verificar se o objeto não está nulo
referencie views em classes anônimas que tenham tempo de vida mais longo que a activity • Use as ferramentas de profiling e Leak Canary para detectar leaks e ver o comportamento do seu app