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

Mobileconf dicas-android

on

  • 1,175 views

Apresentação feita durante o mobileconf.

Apresentação feita durante o mobileconf.

Statistics

Views

Total Views
1,175
Views on SlideShare
1,162
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 Mobileconf dicas-android Presentation Transcript

  • 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); 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);
  • 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,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(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 }
  • • 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(calculaPaginaAtual()); } catch(LocationProvidersOffException e) { newGPSAlert(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 = 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,
  • • 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<TodosImoveis>() { @Override public void onSucess(TodosImoveis result){BuscaPeloFiltroTask.this.onPostExecute(result); } //onError...
  • do androidpublic void execute(Integer... params) { enganaOCaraEUsaOutraLib(params);}
  • Customizando AsyncHttpClient client = newAsyncHttpClient(); 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)).getMemoryClass(); 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, Bitmapbitmap) { return bitmap.getByteCount(); }; };
  • Pontos lentos• Como descobrir?
  • App que consome serviço• Vai olhar o serviço
  • Profile• Vamos chorar
  • StrictMode StrictMode.setThreadPolicy(newStrictMode.ThreadPolicy.Builder() .detectDiskReads() .detectDiskWrites() .detectNetwork() .penaltyLog() .build()); StrictMode.setVmPolicy(newStrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects() .detectLeakedClosableObjects() .penaltyLog() .build());
  • 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
  • Mais profile• Traceview
  • Marca os pontos public void buscaAPagina(int pagina) throwsLocationProvidersOffException{ 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 maispower capacity 20window scale 0.5
  • Valeu! @alberto_souzagithub.com/asouza