Mobileconf dicas-android

1,139 views
1,045 views

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
1,139
On SlideShare
0
From Embeds
0
Number of Embeds
15
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

×