SlideShare uma empresa Scribd logo
1 de 50
androidiana
Alberto Souza


• @alberto_souza
• github.com/asouza
Parsear json

• Implementação padrão do
  Android(org.json)
• GSON
• Outros zilhões
try {

                  JSONObject imoveisComTotal = new


                       JSON-Java
JSONObject(imoveisJSON);

                      JSONArray jsonArrayDeImoveis = imoveisComTotal

                                  .getJSONArray("imoveis");



                      for (int i = 0; i < jsonArrayDeImoveis.length();
i++) {



                            JSONObject jsonObjectDoImovel = new
JSONObject(


jsonArrayDeImoveis.getJSONObject(i).toString());



                            JSONObject jsonImovel = new JSONObject(


jsonObjectDoImovel.getString("imovel"));

                        Imovel imovel =
criaImovelEmFuncaoDo(jsonImovel);
Braçal


• Deu trabalho então me entregue uma
  vantagem
GSON


private final static Gson gson = new Gson();

gson.toJson(serializable);
Justo

• Suporta as situações mais comuns
• Mas ainda achei meio lento
• Tem que ter o modelo compatível
Benchmarks

• Todos mentirosos :)
• https://github.com/eishay/jvm-serializers
• http://martinadamek.com/2011/01/31/comparison-
JACKSON


     ObjectMapper mapper = new ObjectMapper();

      TodosImoveis todosImoveis =
mapper.readValue(imoveisJSON,TodosImoveis.class);
• Suporta as situações mais comuns
• Mais fléxivel em relação ao mapeamento,
  atributo ou getter/setter
• Realmente foi mais rápido.
Fallback esperto
    @JsonAnySetter

    public void handleUnknown(String key, Object value)
{

         if (key.equals("fallback_url")) {

              this.linkOriginal = value.toString();

         }

    }
try{
                     Modo hard
                        JsonFactory f = new JsonFactory();

                      JsonGenerator g = f.createJsonGenerator(new
StringWriter());



                      g.writeStartObject();

                      g.writeObjectFieldStart("imovel");

                      g.writeStringField("titulo","Casa de praia em
salvador");

                      g.writeStringField("descricao", "Joe");


                      g.writeEndObject(); // for field 'name'


                      g.close(); // important: will force flushing
of output, close underlying output stream

              }
• Bem mais rápido
• Tem que ler na ordem dos campos do json
• Tudo braçal
• Como fazer os requests?
• Faz só o básico
• Tentativa de conexão não deu certo
Vai perder fácil?
• Pedir a resposta gzipada?
• Tempo máximo de espera
Deixar esperando
Feedback
                         try {

                              new
BuscaProximos(proximosFragment)


.buscaAPagina(calculaPaginaAtual());

                         } catch
(LocationProvidersOffException e) {

                              new
GPSAlert(proximosFragment).show();

                         }
• Configurações prontas
HttpConnectionParams.setSocketBufferSize(httpParams,
DEFAULT_SOCKET_BUFFER_SIZE);




                       Código
                    HttpProtocolParams.setVersion(httpParams,
HttpVersion.HTTP_1_1);

                    HttpProtocolParams.setUserAgent(httpParams,
String.format("android-async-http/%s (http://loopj.com/android-
async-http)", VERSION));



                    SchemeRegistry schemeRegistry = new
SchemeRegistry();

                    schemeRegistry.register(new Scheme("http",
PlainSocketFactory.getSocketFactory(), 80));

                    schemeRegistry.register(new Scheme("https",
SSLSocketFactory.getSocketFactory(), 443));

                    ThreadSafeClientConnManager cm = new
ThreadSafeClientConnManager(httpParams, schemeRegistry);



                    httpContext = new SyncBasicHttpContext(new
BasicHttpContext());

                    httpClient = new DefaultHttpClient(cm,
• Retry pronto
• Tempo máximo configurado
• GZIP
• Handler para binário
Simples de usar



          AsyncHttpClient client = new
AsyncHttpClient();

          client.get(url,tratadorDoRetorno);
Handler padrão

          DefaultRequestHandler<TodosImoveis>
imoveisEncontradosHandler = new
DefaultRequestHandler<TodosImoveis>() {



               @Override

               public void onSucess(TodosImoveis result)
{


BuscaPeloFiltroTask.this.onPostExecute(result);

               }



         //onError...
do android



public void execute(Integer... params) {

     enganaOCaraEUsaOutraLib(params);

}
Customizando


          AsyncHttpClient client = new
AsyncHttpClient();



          DefaultHttpClient defaultClient =
(DefaultHttpClient) client.getHttpClient();



          HttpRequestRetryHandler retryHandler =
defaultClient.getHttpRequestRetryHandler();



          client.get(url,handler);
Um pouco de
       performance


• Carregar imagens por exemplo
Cache


• Tamanho do cache
Problemas

• Expiração
• Memória
• Tamanho
Baseado no aparelho


• Cache pronto para usar nas apps android
LRUCache


          final int memClass = ((ActivityManager) this


.getSystemService(Context.ACTIVITY_SERVICE)).getMemoryCl
ass();

          int memoryInBytes = 1024 * 1024 * memClass;

          final int cacheSize = memoryInBytes / 8;

          cache = new LruCache<String,Bitmap>(maxSize);
Tamanho das entradas
     do cache


• Como fazemos?
comportamento


             cache = new LruCache<String,Bitmap>(maxSize) {

                 protected int sizeOf(String key, Bitmap
bitmap) {

                      return bitmap.getByteCount();

                 };

            };
Pontos lentos


• Como descobrir?
App que consome
         serviço


• Vai olhar o serviço
Profile


• Vamos chorar
StrictMode

               StrictMode.setThreadPolicy(new
StrictMode.ThreadPolicy.Builder()

                       .detectDiskReads()

                       .detectDiskWrites()

                       .detectNetwork()

                       .penaltyLog()

                       .build());

               StrictMode.setVmPolicy(new
StrictMode.VmPolicy.Builder()

                       .detectLeakedSqlLiteObjects()

                       .detectLeakedClosableObjects()

                       .penaltyLog()

                       .build());
Reclamação
android.database.CursorWrapper.moveToFirst(CursorWrapper.java:65)

      04-05 11:07:54.598: E/StrictMode(6032):   at
android_maps_conflict_avoidance.com.google.common.android.AndroidConfi
g.getSetting(AndroidConfig.java:219)

      04-05 11:07:54.598: E/StrictMode(6032):   at
android_maps_conflict_avoidance.com.google.common.android.AndroidConfi
g.getDistributionChannelInternal(AndroidConfig.java:197)

      04-05 11:07:54.598: E/StrictMode(6032):   at
android_maps_conflict_avoidance.com.google.common.Config.init(Config.j
ava:273)

      04-05 11:07:54.598: E/StrictMode(6032):   at
android_maps_conflict_avoidance.com.google.common.android.AndroidConfi
g.<init>(AndroidConfig.java:100)

      04-05 11:07:54.598: E/StrictMode(6032):   at
android_maps_conflict_avoidance.com.google.common.android.AndroidConfi
g.<init>(AndroidConfig.java:87)

      04-05 11:07:54.598: E/StrictMode(6032):   at
com.google.android.maps.MapActivity.onCreate(MapActivity.java:419)

      04-05 11:07:54.598: E/StrictMode(6032):   at
android.support.v4.app.FragmentActivity.onCreate(Unknown Source)

      04-05 11:07:54.598: E/StrictMode(6032):   at
br.com.homehunter.infra.UseStorageFragmentActivity.onCreate(UseStorage
FragmentActivity.java:14)

      04-05 11:07:54.598: E/StrictMode(6032):   at
Mais profile


• Traceview
Marca os pontos


     public void buscaAPagina(int pagina) throws
LocationProvidersOffException{

           Debug.startMethodTracing("buscaPagina");

       //possivel código ruim aqui

       Debug.stopMethodTracing();

   }
Busca o arquivo



./adb pull /sdcard/buscaPagina.trace /tmp



./traceview /tmp/buscaPagina
Agora vai caçar
Comandos para o
      emulador


• DDMS/Emulator control
Mas...


• Já tentou controlar a bateria?
• E quando subiu o emulador com o tamanho
  errado
Chique


• Conectar no emulador via telnet
Comando
coisas a mais



power capacity 20


window scale 0.5
Valeu!
 @alberto_souza
github.com/asouza

Mais conteúdo relacionado

Mais procurados

Desvendando as ferramentas e serviços para o desenvolvedor Android
Desvendando as ferramentas e serviços para o desenvolvedor AndroidDesvendando as ferramentas e serviços para o desenvolvedor Android
Desvendando as ferramentas e serviços para o desenvolvedor Androidjoaobmonteiro
 
JavaScript - De verdade
JavaScript - De verdadeJavaScript - De verdade
JavaScript - De verdadeLuis Vendrame
 
Spock Framework 2
Spock Framework 2Spock Framework 2
Spock Framework 2Ismael
 
Node.js - #5 - Process - Rodrigo Branas
Node.js - #5 - Process - Rodrigo BranasNode.js - #5 - Process - Rodrigo Branas
Node.js - #5 - Process - Rodrigo BranasRodrigo Branas
 
Hibernate efetivo (COALTI-2014 / ALJUG)
Hibernate efetivo (COALTI-2014 / ALJUG)Hibernate efetivo (COALTI-2014 / ALJUG)
Hibernate efetivo (COALTI-2014 / ALJUG)Rafael Ponte
 
TDC2016SP - Trilha Node.Js
TDC2016SP - Trilha Node.JsTDC2016SP - Trilha Node.Js
TDC2016SP - Trilha Node.Jstdc-globalcode
 
Jug bizus (4)
Jug   bizus (4)Jug   bizus (4)
Jug bizus (4)JugVale
 
Ajax O Objeto Xml Http Request Parte 3
Ajax   O Objeto Xml Http Request   Parte 3Ajax   O Objeto Xml Http Request   Parte 3
Ajax O Objeto Xml Http Request Parte 3infinitopublicidade
 
Programação functional reativa: lidando com código assíncrono
Programação functional reativa: lidando com código assíncronoProgramação functional reativa: lidando com código assíncrono
Programação functional reativa: lidando com código assíncronoLeonardo Borges
 
LaravelSP - MySQL 5.7: introdução ao JSON Data Type
LaravelSP - MySQL 5.7: introdução ao JSON Data TypeLaravelSP - MySQL 5.7: introdução ao JSON Data Type
LaravelSP - MySQL 5.7: introdução ao JSON Data TypeGabriela Ferrara
 
Introdução ao MongoDB em 30 slides
Introdução ao MongoDB em 30 slidesIntrodução ao MongoDB em 30 slides
Introdução ao MongoDB em 30 slidesDerek Willian Stavis
 
Turbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com KotlinTurbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com KotlinNelson Glauber Leal
 
Grails - Destaques (para quem já sabe Java)
Grails - Destaques (para quem já sabe Java)Grails - Destaques (para quem já sabe Java)
Grails - Destaques (para quem já sabe Java)Douglas Mendes
 

Mais procurados (20)

Desvendando as ferramentas e serviços para o desenvolvedor Android
Desvendando as ferramentas e serviços para o desenvolvedor AndroidDesvendando as ferramentas e serviços para o desenvolvedor Android
Desvendando as ferramentas e serviços para o desenvolvedor Android
 
Threads e Estruturas de dados
Threads e Estruturas de dadosThreads e Estruturas de dados
Threads e Estruturas de dados
 
JavaScript - De verdade
JavaScript - De verdadeJavaScript - De verdade
JavaScript - De verdade
 
Spock Framework 2
Spock Framework 2Spock Framework 2
Spock Framework 2
 
Node.js - #5 - Process - Rodrigo Branas
Node.js - #5 - Process - Rodrigo BranasNode.js - #5 - Process - Rodrigo Branas
Node.js - #5 - Process - Rodrigo Branas
 
Hibernate efetivo (COALTI-2014 / ALJUG)
Hibernate efetivo (COALTI-2014 / ALJUG)Hibernate efetivo (COALTI-2014 / ALJUG)
Hibernate efetivo (COALTI-2014 / ALJUG)
 
OOP ObjC
OOP ObjCOOP ObjC
OOP ObjC
 
Ajax em java
Ajax em javaAjax em java
Ajax em java
 
TDC2016SP - Trilha Node.Js
TDC2016SP - Trilha Node.JsTDC2016SP - Trilha Node.Js
TDC2016SP - Trilha Node.Js
 
Jug bizus (4)
Jug   bizus (4)Jug   bizus (4)
Jug bizus (4)
 
Jug bizus
Jug   bizusJug   bizus
Jug bizus
 
Node.js: serious business
Node.js: serious businessNode.js: serious business
Node.js: serious business
 
JavaScript Hacks
JavaScript HacksJavaScript Hacks
JavaScript Hacks
 
Ajax O Objeto Xml Http Request Parte 3
Ajax   O Objeto Xml Http Request   Parte 3Ajax   O Objeto Xml Http Request   Parte 3
Ajax O Objeto Xml Http Request Parte 3
 
Floggy-JustJava-2008-09-10
Floggy-JustJava-2008-09-10Floggy-JustJava-2008-09-10
Floggy-JustJava-2008-09-10
 
Programação functional reativa: lidando com código assíncrono
Programação functional reativa: lidando com código assíncronoProgramação functional reativa: lidando com código assíncrono
Programação functional reativa: lidando com código assíncrono
 
LaravelSP - MySQL 5.7: introdução ao JSON Data Type
LaravelSP - MySQL 5.7: introdução ao JSON Data TypeLaravelSP - MySQL 5.7: introdução ao JSON Data Type
LaravelSP - MySQL 5.7: introdução ao JSON Data Type
 
Introdução ao MongoDB em 30 slides
Introdução ao MongoDB em 30 slidesIntrodução ao MongoDB em 30 slides
Introdução ao MongoDB em 30 slides
 
Turbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com KotlinTurbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com Kotlin
 
Grails - Destaques (para quem já sabe Java)
Grails - Destaques (para quem já sabe Java)Grails - Destaques (para quem já sabe Java)
Grails - Destaques (para quem já sabe Java)
 

Semelhante a Mobileconf dicas-android

TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...
TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...
TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...tdc-globalcode
 
Fisl 11 - Ecossistema Ruby on Rails
Fisl 11 - Ecossistema Ruby on RailsFisl 11 - Ecossistema Ruby on Rails
Fisl 11 - Ecossistema Ruby on RailsFabio Akita
 
Apresentação sobre MVVMC
Apresentação sobre MVVMCApresentação sobre MVVMC
Apresentação sobre MVVMCAlisson Agiani
 
DevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webappsDevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webappsSuissa
 
Data mapping com Groovy - Part 2
Data mapping com Groovy - Part 2Data mapping com Groovy - Part 2
Data mapping com Groovy - Part 2Jeison Barros
 
Javascript no SAPO e libsapojs
Javascript no SAPO e libsapojsJavascript no SAPO e libsapojs
Javascript no SAPO e libsapojscodebits
 
Minicurso de PHP Com Ajax
Minicurso de PHP Com AjaxMinicurso de PHP Com Ajax
Minicurso de PHP Com AjaxAdler Medrado
 
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo BranasNode.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo BranasRodrigo Branas
 
Oficina Android - Games com AndEngine - Dia 3
Oficina Android - Games com AndEngine - Dia 3Oficina Android - Games com AndEngine - Dia 3
Oficina Android - Games com AndEngine - Dia 3Odair Bonin Borges
 
Spring + Tapestry Um novo paradigma de desenvolvimento web
Spring + Tapestry Um novo paradigma de desenvolvimento webSpring + Tapestry Um novo paradigma de desenvolvimento web
Spring + Tapestry Um novo paradigma de desenvolvimento webelliando dias
 
Html5 storage api
Html5 storage apiHtml5 storage api
Html5 storage apiSuissa
 
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EEJavaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EELoiane Groner
 

Semelhante a Mobileconf dicas-android (20)

TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...
TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...
TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...
 
Fisl 11 - Ecossistema Ruby on Rails
Fisl 11 - Ecossistema Ruby on RailsFisl 11 - Ecossistema Ruby on Rails
Fisl 11 - Ecossistema Ruby on Rails
 
Apresentação sobre MVVMC
Apresentação sobre MVVMCApresentação sobre MVVMC
Apresentação sobre MVVMC
 
DevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webappsDevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webapps
 
Minicurso groovy grails
Minicurso groovy grailsMinicurso groovy grails
Minicurso groovy grails
 
Data mapping com Groovy - Part 2
Data mapping com Groovy - Part 2Data mapping com Groovy - Part 2
Data mapping com Groovy - Part 2
 
Javascript no SAPO e libsapojs
Javascript no SAPO e libsapojsJavascript no SAPO e libsapojs
Javascript no SAPO e libsapojs
 
Minicurso de PHP Com Ajax
Minicurso de PHP Com AjaxMinicurso de PHP Com Ajax
Minicurso de PHP Com Ajax
 
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo BranasNode.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
 
Android na Prática
Android na PráticaAndroid na Prática
Android na Prática
 
JPA - Java Persistence API
JPA - Java Persistence APIJPA - Java Persistence API
JPA - Java Persistence API
 
Testes integrados automatizados
Testes integrados automatizadosTestes integrados automatizados
Testes integrados automatizados
 
Javascript Ilegível
Javascript IlegívelJavascript Ilegível
Javascript Ilegível
 
Oficina Android - Games com AndEngine - Dia 3
Oficina Android - Games com AndEngine - Dia 3Oficina Android - Games com AndEngine - Dia 3
Oficina Android - Games com AndEngine - Dia 3
 
Spring + Tapestry Um novo paradigma de desenvolvimento web
Spring + Tapestry Um novo paradigma de desenvolvimento webSpring + Tapestry Um novo paradigma de desenvolvimento web
Spring + Tapestry Um novo paradigma de desenvolvimento web
 
Power mock
Power mockPower mock
Power mock
 
Html5 storage api
Html5 storage apiHtml5 storage api
Html5 storage api
 
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EEJavaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
 
Wicket 2008
Wicket 2008Wicket 2008
Wicket 2008
 
RMI em Java
RMI em JavaRMI em Java
RMI em Java
 

Mobileconf dicas-android

  • 3. Parsear json • Implementação padrão do Android(org.json) • GSON • Outros zilhões
  • 4. try { JSONObject imoveisComTotal = new JSON-Java JSONObject(imoveisJSON); JSONArray jsonArrayDeImoveis = imoveisComTotal .getJSONArray("imoveis"); for (int i = 0; i < jsonArrayDeImoveis.length(); i++) { JSONObject jsonObjectDoImovel = new JSONObject( jsonArrayDeImoveis.getJSONObject(i).toString()); JSONObject jsonImovel = new JSONObject( jsonObjectDoImovel.getString("imovel")); Imovel imovel = criaImovelEmFuncaoDo(jsonImovel);
  • 5. Braçal • Deu trabalho então me entregue uma vantagem
  • 6. GSON private final static Gson gson = new Gson(); gson.toJson(serializable);
  • 7. Justo • Suporta as situações mais comuns • Mas ainda achei meio lento • Tem que ter o modelo compatível
  • 8. Benchmarks • Todos mentirosos :) • https://github.com/eishay/jvm-serializers • http://martinadamek.com/2011/01/31/comparison-
  • 9. JACKSON ObjectMapper mapper = new ObjectMapper(); TodosImoveis todosImoveis = mapper.readValue(imoveisJSON,TodosImoveis.class);
  • 10. • Suporta as situações mais comuns • Mais fléxivel em relação ao mapeamento, atributo ou getter/setter • Realmente foi mais rápido.
  • 11. Fallback esperto @JsonAnySetter public void handleUnknown(String key, Object value) { if (key.equals("fallback_url")) { this.linkOriginal = value.toString(); } }
  • 12. try{ Modo hard JsonFactory f = new JsonFactory(); JsonGenerator g = f.createJsonGenerator(new StringWriter()); g.writeStartObject(); g.writeObjectFieldStart("imovel"); g.writeStringField("titulo","Casa de praia em salvador"); g.writeStringField("descricao", "Joe"); g.writeEndObject(); // for field 'name' g.close(); // important: will force flushing of output, close underlying output stream }
  • 13. • Bem mais rápido • Tem que ler na ordem dos campos do json • Tudo braçal
  • 14. • Como fazer os requests?
  • 15. • Faz só o básico
  • 16. • Tentativa de conexão não deu certo
  • 18. • Pedir a resposta gzipada?
  • 19. • Tempo máximo de espera
  • 21. Feedback try { new BuscaProximos(proximosFragment) .buscaAPagina(calculaPaginaAtual()); } catch (LocationProvidersOffException e) { new GPSAlert(proximosFragment).show(); }
  • 23. HttpConnectionParams.setSocketBufferSize(httpParams, DEFAULT_SOCKET_BUFFER_SIZE); Código HttpProtocolParams.setVersion(httpParams, HttpVersion.HTTP_1_1); HttpProtocolParams.setUserAgent(httpParams, String.format("android-async-http/%s (http://loopj.com/android- async-http)", VERSION)); SchemeRegistry schemeRegistry = new SchemeRegistry(); schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); schemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443)); ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(httpParams, schemeRegistry); httpContext = new SyncBasicHttpContext(new BasicHttpContext()); httpClient = new DefaultHttpClient(cm,
  • 24. • Retry pronto • Tempo máximo configurado • GZIP • Handler para binário
  • 25. Simples de usar AsyncHttpClient client = new AsyncHttpClient(); client.get(url,tratadorDoRetorno);
  • 26. Handler padrão DefaultRequestHandler<TodosImoveis> imoveisEncontradosHandler = new DefaultRequestHandler<TodosImoveis>() { @Override public void onSucess(TodosImoveis result) { BuscaPeloFiltroTask.this.onPostExecute(result); } //onError...
  • 27. do android public void execute(Integer... params) { enganaOCaraEUsaOutraLib(params); }
  • 28. Customizando AsyncHttpClient client = new AsyncHttpClient(); DefaultHttpClient defaultClient = (DefaultHttpClient) client.getHttpClient(); HttpRequestRetryHandler retryHandler = defaultClient.getHttpRequestRetryHandler(); client.get(url,handler);
  • 29. Um pouco de performance • Carregar imagens por exemplo
  • 32. Baseado no aparelho • Cache pronto para usar nas apps android
  • 33. LRUCache final int memClass = ((ActivityManager) this .getSystemService(Context.ACTIVITY_SERVICE)).getMemoryCl ass(); int memoryInBytes = 1024 * 1024 * memClass; final int cacheSize = memoryInBytes / 8; cache = new LruCache<String,Bitmap>(maxSize);
  • 34. Tamanho das entradas do cache • Como fazemos?
  • 35. comportamento cache = new LruCache<String,Bitmap>(maxSize) { protected int sizeOf(String key, Bitmap bitmap) { return bitmap.getByteCount(); }; };
  • 37. App que consome serviço • Vai olhar o serviço
  • 39. StrictMode StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads() .detectDiskWrites() .detectNetwork() .penaltyLog() .build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects() .detectLeakedClosableObjects() .penaltyLog() .build());
  • 40. Reclamação android.database.CursorWrapper.moveToFirst(CursorWrapper.java:65) 04-05 11:07:54.598: E/StrictMode(6032): at android_maps_conflict_avoidance.com.google.common.android.AndroidConfi g.getSetting(AndroidConfig.java:219) 04-05 11:07:54.598: E/StrictMode(6032): at android_maps_conflict_avoidance.com.google.common.android.AndroidConfi g.getDistributionChannelInternal(AndroidConfig.java:197) 04-05 11:07:54.598: E/StrictMode(6032): at android_maps_conflict_avoidance.com.google.common.Config.init(Config.j ava:273) 04-05 11:07:54.598: E/StrictMode(6032): at android_maps_conflict_avoidance.com.google.common.android.AndroidConfi g.<init>(AndroidConfig.java:100) 04-05 11:07:54.598: E/StrictMode(6032): at android_maps_conflict_avoidance.com.google.common.android.AndroidConfi g.<init>(AndroidConfig.java:87) 04-05 11:07:54.598: E/StrictMode(6032): at com.google.android.maps.MapActivity.onCreate(MapActivity.java:419) 04-05 11:07:54.598: E/StrictMode(6032): at android.support.v4.app.FragmentActivity.onCreate(Unknown Source) 04-05 11:07:54.598: E/StrictMode(6032): at br.com.homehunter.infra.UseStorageFragmentActivity.onCreate(UseStorage FragmentActivity.java:14) 04-05 11:07:54.598: E/StrictMode(6032): at
  • 42. Marca os pontos public void buscaAPagina(int pagina) throws LocationProvidersOffException{ Debug.startMethodTracing("buscaPagina"); //possivel código ruim aqui Debug.stopMethodTracing(); }
  • 43. Busca o arquivo ./adb pull /sdcard/buscaPagina.trace /tmp ./traceview /tmp/buscaPagina
  • 45. Comandos para o emulador • DDMS/Emulator control
  • 46. Mas... • Já tentou controlar a bateria? • E quando subiu o emulador com o tamanho errado
  • 47. Chique • Conectar no emulador via telnet
  • 49. coisas a mais power capacity 20 window scale 0.5