Tecnologia do Blogger.
RSS

[androidbrasil-dev] Alocação de memória (parece pergunta básica, mas não é)

Oi,

TL;DR :

Tem algum jeito no Android de ***tentar*** alocar um valor "grande" de memória, eg. 64MB e caso isso falhe eu usar uma alternativa? Nota, isso pode ocorrer algumas dezenas de vezes por minuto.

Versão Completa :

Tenho que fazer comunicação em rede local com um aplicativo externo que usa um protocolo proprietário e criptografado. Não tenho como mudar o protocolo nem criptografia, e mesmo se tivesse, não faria isso. Meu problema é que frequentemente passam imagens de ~16MB nessa comunicação e 16MB (criptografado) + 16MB (não criptografado) + 16MB (bitmap no formato de Android) + x MB (bitmap no tamanho adequado pro dispositivo) tudo isso vezes 16 imagens por minuto (um valor médio) vai me dar um OOM e pronto, usuário nunca vai usar meu aplicativo. Essa quantidade "excessiva" de memória eu acho que não tenho como controlar, já que APIs do Android de criptografia não fazem em cima do byte array passado como parâmetro, como qualquer API em C faz.

(Nota: é obvio que não vou alocar espaço pra 16 imagens de uma vez, mas imagine recebendo imagens continuamente, memória é alocada, liberada, sei lá quando GC vai rodar, se ele vai tentar reorganizar memória pra me dar um bloco do tamanho que quero, se vai me dar OOM)

Então, o que queria era ver se tem alguma forma em Java de alocar um valor de memória e reutilizá-lo se possível, se puder eu faço tudo em RAM, se não tiver memória disponível eu jogo a conversão pra fazer inteira em disco (o que é pelo menos 20x mais lento, nos primeiros testes que fiz). 

(lembre-se que Out of Memory Error é ERROR e não Exception, não é seguro fazer um try/catch).

Respostas que eu não gostaria de ler :
- "mude o protocolo" -> não tenho como;
- "tira criptografia" -> não tenho como;
- "faz tudo em disco" -> é uma solução, mas performance do aplicativo será bastante prejudicada, e imagino que fragmentação de memória deva continuar, o que pode ocasionalmente causar um OOM se o GC não for suficientemente esperto (coisa que ele nunca foi);
- "try…catch (OutOfMemoryError e)" -> WTF;

--
:: marcelo.alves

--
You received this message because you are subscribed to the Google Groups "Android Brasil - Dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to androidbrasil-dev+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

  • Digg
  • Del.icio.us
  • StumbleUpon
  • Reddit
  • RSS

0 comentários:

Postar um comentário