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

Mobileconf dicas-android

on

  • 1,153 views

Apresentação feita durante o mobileconf.

Apresentação feita durante o mobileconf.

Statistics

Views

Total Views
1,153
Slideshare-icon Views on SlideShare
1,140
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