Mobileconf dicas-android
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

Mobileconf dicas-android

on

  • 1,213 views

Apresentação feita durante o mobileconf.

Apresentação feita durante o mobileconf.

Statistics

Views

Total Views
1,213
Views on SlideShare
1,200
Embed Views
13

Actions

Likes
4
Downloads
28
Comments
0

1 Embed 13

https://twitter.com 13

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Mobileconf dicas-android Presentation Transcript

  • 1. androidiana
  • 2. Alberto Souza• @alberto_souza• github.com/asouza
  • 3. Parsear json• Implementação padrão do Android(org.json)• GSON• Outros zilhões
  • 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. Braçal• Deu trabalho então me entregue uma vantagem
  • 6. GSONprivate 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(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. • 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
  • 17. Vai perder fácil?
  • 18. • Pedir a resposta gzipada?
  • 19. • Tempo máximo de espera
  • 20. Deixar esperando
  • 21. Feedback try { newBuscaProximos(proximosFragment).buscaAPagina(calculaPaginaAtual()); } catch(LocationProvidersOffException e) { newGPSAlert(proximosFragment).show(); }
  • 22. • Configurações prontas
  • 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. • Retry pronto• Tempo máximo configurado• GZIP• Handler para binário
  • 25. Simples de usar AsyncHttpClient client = newAsyncHttpClient(); client.get(url,tratadorDoRetorno);
  • 26. Handler padrão DefaultRequestHandler<TodosImoveis>imoveisEncontradosHandler = newDefaultRequestHandler<TodosImoveis>() { @Override public void onSucess(TodosImoveis result){BuscaPeloFiltroTask.this.onPostExecute(result); } //onError...
  • 27. do androidpublic void execute(Integer... params) { enganaOCaraEUsaOutraLib(params);}
  • 28. Customizando AsyncHttpClient client = newAsyncHttpClient(); DefaultHttpClient defaultClient =(DefaultHttpClient) client.getHttpClient(); HttpRequestRetryHandler retryHandler =defaultClient.getHttpRequestRetryHandler(); client.get(url,handler);
  • 29. Um pouco de performance• Carregar imagens por exemplo
  • 30. Cache• Tamanho do cache
  • 31. Problemas• Expiração• Memória• Tamanho
  • 32. Baseado no aparelho• Cache pronto para usar nas apps android
  • 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. Tamanho das entradas do cache• Como fazemos?
  • 35. comportamento cache = new LruCache<String,Bitmap>(maxSize) { protected int sizeOf(String key, Bitmapbitmap) { return bitmap.getByteCount(); }; };
  • 36. Pontos lentos• Como descobrir?
  • 37. App que consome serviço• Vai olhar o serviço
  • 38. Profile• Vamos chorar
  • 39. StrictMode StrictMode.setThreadPolicy(newStrictMode.ThreadPolicy.Builder() .detectDiskReads() .detectDiskWrites() .detectNetwork() .penaltyLog() .build()); StrictMode.setVmPolicy(newStrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects() .detectLeakedClosableObjects() .penaltyLog() .build());
  • 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. Mais profile• Traceview
  • 42. Marca os pontos public void buscaAPagina(int pagina) throwsLocationProvidersOffException{ Debug.startMethodTracing("buscaPagina"); //possivel código ruim aqui Debug.stopMethodTracing(); }
  • 43. Busca o arquivo./adb pull /sdcard/buscaPagina.trace /tmp./traceview /tmp/buscaPagina
  • 44. Agora vai caçar
  • 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
  • 48. Comando
  • 49. coisas a maispower capacity 20window scale 0.5
  • 50. Valeu! @alberto_souzagithub.com/asouza