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-JavaJSONObject(imoveisJSON);           ...
Braçal• Deu trabalho então me entregue uma  vantagem
GSONprivate 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,TodosIm...
• Suporta as situações mais comuns• Mais fléxivel em relação ao mapeamento,  atributo ou getter/setter• Realmente foi mais...
Fallback esperto    @JsonAnySetter    public void handleUnknown(String key, Object value){         if (key.equals("fallbac...
try{                     Modo hard                        JsonFactory f = new JsonFactory();                      JsonGene...
• 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 {                              newBuscaProximos(proximosFragment).buscaAPagina(calcul...
• Configurações prontas
HttpConnectionParams.setSocketBufferSize(httpParams,DEFAULT_SOCKET_BUFFER_SIZE);                       Código             ...
• Retry pronto• Tempo máximo configurado• GZIP• Handler para binário
Simples de usar          AsyncHttpClient client = newAsyncHttpClient();          client.get(url,tratadorDoRetorno);
Handler padrão          DefaultRequestHandler<TodosImoveis>imoveisEncontradosHandler = newDefaultRequestHandler<TodosImove...
do androidpublic void execute(Integer... params) {     enganaOCaraEUsaOutraLib(params);}
Customizando          AsyncHttpClient client = newAsyncHttpClient();          DefaultHttpClient defaultClient =(DefaultHtt...
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)).getMemoryClass(...
Tamanho das entradas     do cache• Como fazemos?
comportamento             cache = new LruCache<String,Bitmap>(maxSize) {                 protected int sizeOf(String key, ...
Pontos lentos• Como descobrir?
App que consome         serviço• Vai olhar o serviço
Profile• Vamos chorar
StrictMode               StrictMode.setThreadPolicy(newStrictMode.ThreadPolicy.Builder()                       .detectDisk...
Reclamaçãoandroid.database.CursorWrapper.moveToFirst(CursorWrapper.java:65)      04-05 11:07:54.598: E/StrictMode(6032):  ...
Mais profile• Traceview
Marca os pontos     public void buscaAPagina(int pagina) throwsLocationProvidersOffException{           Debug.startMethodT...
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 maispower capacity 20window scale 0.5
Valeu! @alberto_souzagithub.com/asouza
Upcoming SlideShare
Loading in...5
×

Mobileconf dicas-android

917

Published on

Apresentação feita durante o mobileconf.

Published in: Technology, Design
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
917
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
29
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

Mobileconf dicas-android

  1. 1. androidiana
  2. 2. Alberto Souza• @alberto_souza• github.com/asouza
  3. 3. Parsear json• Implementação padrão do Android(org.json)• GSON• Outros zilhões
  4. 4. try { JSONObject imoveisComTotal = new JSON-JavaJSONObject(imoveisJSON); JSONArray jsonArrayDeImoveis = imoveisComTotal .getJSONArray("imoveis"); for (int i = 0; i < jsonArrayDeImoveis.length();i++) { JSONObject jsonObjectDoImovel = newJSONObject(jsonArrayDeImoveis.getJSONObject(i).toString()); JSONObject jsonImovel = new JSONObject(jsonObjectDoImovel.getString("imovel")); Imovel imovel =criaImovelEmFuncaoDo(jsonImovel);
  5. 5. Braçal• Deu trabalho então me entregue uma vantagem
  6. 6. GSONprivate final static Gson gson = new Gson();gson.toJson(serializable);
  7. 7. Justo• Suporta as situações mais comuns• Mas ainda achei meio lento• Tem que ter o modelo compatível
  8. 8. Benchmarks• Todos mentirosos :)• https://github.com/eishay/jvm-serializers• http://martinadamek.com/2011/01/31/comparison-
  9. 9. JACKSON ObjectMapper mapper = new ObjectMapper(); TodosImoveis todosImoveis =mapper.readValue(imoveisJSON,TodosImoveis.class);
  10. 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. 11. Fallback esperto @JsonAnySetter public void handleUnknown(String key, Object value){ if (key.equals("fallback_url")) { this.linkOriginal = value.toString(); } }
  12. 12. try{ Modo hard JsonFactory f = new JsonFactory(); JsonGenerator g = f.createJsonGenerator(newStringWriter()); g.writeStartObject(); g.writeObjectFieldStart("imovel"); g.writeStringField("titulo","Casa de praia emsalvador"); g.writeStringField("descricao", "Joe"); g.writeEndObject(); // for field name g.close(); // important: will force flushingof output, close underlying output stream }
  13. 13. • Bem mais rápido• Tem que ler na ordem dos campos do json• Tudo braçal
  14. 14. • Como fazer os requests?
  15. 15. • Faz só o básico
  16. 16. • Tentativa de conexão não deu certo
  17. 17. Vai perder fácil?
  18. 18. • Pedir a resposta gzipada?
  19. 19. • Tempo máximo de espera
  20. 20. Deixar esperando
  21. 21. Feedback try { newBuscaProximos(proximosFragment).buscaAPagina(calculaPaginaAtual()); } catch(LocationProvidersOffException e) { newGPSAlert(proximosFragment).show(); }
  22. 22. • Configurações prontas
  23. 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 = newSchemeRegistry(); schemeRegistry.register(new Scheme("http",PlainSocketFactory.getSocketFactory(), 80)); schemeRegistry.register(new Scheme("https",SSLSocketFactory.getSocketFactory(), 443)); ThreadSafeClientConnManager cm = newThreadSafeClientConnManager(httpParams, schemeRegistry); httpContext = new SyncBasicHttpContext(newBasicHttpContext()); httpClient = new DefaultHttpClient(cm,
  24. 24. • Retry pronto• Tempo máximo configurado• GZIP• Handler para binário
  25. 25. Simples de usar AsyncHttpClient client = newAsyncHttpClient(); client.get(url,tratadorDoRetorno);
  26. 26. Handler padrão DefaultRequestHandler<TodosImoveis>imoveisEncontradosHandler = newDefaultRequestHandler<TodosImoveis>() { @Override public void onSucess(TodosImoveis result){BuscaPeloFiltroTask.this.onPostExecute(result); } //onError...
  27. 27. do androidpublic void execute(Integer... params) { enganaOCaraEUsaOutraLib(params);}
  28. 28. Customizando AsyncHttpClient client = newAsyncHttpClient(); DefaultHttpClient defaultClient =(DefaultHttpClient) client.getHttpClient(); HttpRequestRetryHandler retryHandler =defaultClient.getHttpRequestRetryHandler(); client.get(url,handler);
  29. 29. Um pouco de performance• Carregar imagens por exemplo
  30. 30. Cache• Tamanho do cache
  31. 31. Problemas• Expiração• Memória• Tamanho
  32. 32. Baseado no aparelho• Cache pronto para usar nas apps android
  33. 33. LRUCache final int memClass = ((ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE)).getMemoryClass(); int memoryInBytes = 1024 * 1024 * memClass; final int cacheSize = memoryInBytes / 8; cache = new LruCache<String,Bitmap>(maxSize);
  34. 34. Tamanho das entradas do cache• Como fazemos?
  35. 35. comportamento cache = new LruCache<String,Bitmap>(maxSize) { protected int sizeOf(String key, Bitmapbitmap) { return bitmap.getByteCount(); }; };
  36. 36. Pontos lentos• Como descobrir?
  37. 37. App que consome serviço• Vai olhar o serviço
  38. 38. Profile• Vamos chorar
  39. 39. StrictMode StrictMode.setThreadPolicy(newStrictMode.ThreadPolicy.Builder() .detectDiskReads() .detectDiskWrites() .detectNetwork() .penaltyLog() .build()); StrictMode.setVmPolicy(newStrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects() .detectLeakedClosableObjects() .penaltyLog() .build());
  40. 40. Reclamaçãoandroid.database.CursorWrapper.moveToFirst(CursorWrapper.java:65) 04-05 11:07:54.598: E/StrictMode(6032): atandroid_maps_conflict_avoidance.com.google.common.android.AndroidConfig.getSetting(AndroidConfig.java:219) 04-05 11:07:54.598: E/StrictMode(6032): atandroid_maps_conflict_avoidance.com.google.common.android.AndroidConfig.getDistributionChannelInternal(AndroidConfig.java:197) 04-05 11:07:54.598: E/StrictMode(6032): atandroid_maps_conflict_avoidance.com.google.common.Config.init(Config.java:273) 04-05 11:07:54.598: E/StrictMode(6032): atandroid_maps_conflict_avoidance.com.google.common.android.AndroidConfig.<init>(AndroidConfig.java:100) 04-05 11:07:54.598: E/StrictMode(6032): atandroid_maps_conflict_avoidance.com.google.common.android.AndroidConfig.<init>(AndroidConfig.java:87) 04-05 11:07:54.598: E/StrictMode(6032): atcom.google.android.maps.MapActivity.onCreate(MapActivity.java:419) 04-05 11:07:54.598: E/StrictMode(6032): atandroid.support.v4.app.FragmentActivity.onCreate(Unknown Source) 04-05 11:07:54.598: E/StrictMode(6032): atbr.com.homehunter.infra.UseStorageFragmentActivity.onCreate(UseStorageFragmentActivity.java:14) 04-05 11:07:54.598: E/StrictMode(6032): at
  41. 41. Mais profile• Traceview
  42. 42. Marca os pontos public void buscaAPagina(int pagina) throwsLocationProvidersOffException{ Debug.startMethodTracing("buscaPagina"); //possivel código ruim aqui Debug.stopMethodTracing(); }
  43. 43. Busca o arquivo./adb pull /sdcard/buscaPagina.trace /tmp./traceview /tmp/buscaPagina
  44. 44. Agora vai caçar
  45. 45. Comandos para o emulador• DDMS/Emulator control
  46. 46. Mas...• Já tentou controlar a bateria?• E quando subiu o emulador com o tamanho errado
  47. 47. Chique• Conectar no emulador via telnet
  48. 48. Comando
  49. 49. coisas a maispower capacity 20window scale 0.5
  50. 50. Valeu! @alberto_souzagithub.com/asouza
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×