Quero mostrar a imagem Bitmap no ImageView do cartão SD que já está armazenado. Após a execução, meu aplicativo está travando e recebendo o erro OutOfMemoryError de:
(java.lang.OutOfMemoryError: falha ao alocar uma alocação de 23970828 bytes com 2097152 bytes livres e 2 MB até o OOM)
Não faço ideia ou por que está sem memória. Eu acho que o tamanho da minha imagem é muito grande, então tentei alterá-lo.
Iterator<String> it = imageArray.iterator();
while (it.hasNext()) {
Object element = it.next();
String objElement = element.toString();
Log.e("objElement ", " = " + objElement);
final ImageView imageView = new ImageView (getContext());
final ProgressBar pBar = new ProgressBar(getContext(), null,
android.R.attr.progressBarStyleSmall);
imageView.setTag(it);
pBar.setTag(it);
imageView.setImageResource(R.drawable.img_placeholder);
pBar.setVisibility(View.VISIBLE);
if (objElement.endsWith(mp3_Pattern)) {
Log.e("Mp3 ", " ends with ");
pBar.setVisibility(View.GONE);
imageView.setImageResource(R.drawable.audio_control);
}
if (objElement.endsWith(png_Pattern)) {
Bitmap bitmap = BitmapFactory.decodeFile(objElement);
int size = Math.min(bitmap.getWidth(), bitmap.getHeight());
int x = (bitmap.getWidth() - size) / 2;
int y = (bitmap.getHeight() - size) / 2;
Bitmap bitmap_Resul = Bitmap.createBitmap(bitmap, x, y, size, size);
Log.e("bitmap_Resul "," = "+ bitmap_Resul);
if (bitmap_Resul != bitmap) {
bitmap.recycle();
}
imageView.setImageBitmap(bitmap_Resul);
Log.e("png_Pattern ", " ends with ");
Log.e(" bitmap "," = " + bitmap);
}
holder.linearLayout.addView(imageView);
holder.linearLayout.addView(pBar);
As informações do gato de log:
08-27 14:11:15.307 1857-1857/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.tazeen.classnkk, PID: 1857
java.lang.OutOfMemoryError: Failed to allocate a 23970828 byte allocation with 2097152 free bytes and 2MB until OOM
at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
at android.graphics.Bitmap.nativeCreate(Native Method)
at android.graphics.Bitmap.createBitmap(Bitmap.java:812)
at android.graphics.Bitmap.createBitmap(Bitmap.java:789)
at android.graphics.Bitmap.createBitmap(Bitmap.java:709)
at android.graphics.Bitmap.createBitmap(Bitmap.java:634)
at com.example.tazeen.classnkk.AllPosts_Page$MyListAdapter.getView(AllPosts_Page.java:357)
at android.widget.AbsListView.obtainView(AbsListView.java:2347)
at android.widget.ListView.makeAndAddView(ListView.java:1864)
at android.widget.ListView.fillDown(ListView.java:698)
at android.widget.ListView.fillFromTop(ListView.java:759)
at android.widget.ListView.layoutChildren(ListView.java:1659)
at android.widget.AbsListView.onLayout(AbsListView.java:2151)
at android.view.View.layout(View.java:15671)
at android.view.ViewGroup.layout(ViewGroup.java:5038)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
at android.view.View.layout(View.java:15671)
at android.view.ViewGroup.layout(ViewGroup.java:5038)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
at android.view.View.layout(View.java:15671)
at android.view.ViewGroup.layout(ViewGroup.java:5038)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
at android.view.View.layout(View.java:15671)
at android.view.ViewGroup.layout(ViewGroup.java:5038)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
at android.view.View.layout(View.java:15671)
at android.view.ViewGroup.layout(ViewGroup.java:5038)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2086)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1843)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5885)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
at android.view.Choreographer.doCallbacks(Choreographer.java:580)
at android.view.Choreographer.doFrame(Choreographer.java:550)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5257)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
android
android-bitmap
androidTag
fonte
fonte
Respostas:
Erro de falta de memória é o problema mais comum ocorrido no Android, ao lidar especialmente com bitmaps. Este erro é lançado pela Java Virtual Machine (JVM) quando um objeto não pode ser alocado devido à falta de espaço na memória e também, o coletor de lixo não pode liberar algum espaço.
Conforme mencionado por Aleksey, você pode adicionar abaixo entidades no seu arquivo de manifesto
android:hardwareAccelerated="false"
,android:largeHeap="true"
ele funcionará para alguns ambientes.você deve ler definitivamente alguns dos conceitos de desenvolvedores do Android, especialmente aqui: Exibindo bitmaps com eficiência
Leia todos os 5 tópicos e reescreva seu código novamente. Se ainda assim não funcionar, ficaremos felizes em ver o que você fez de errado com o material do tutorial.
Aqui estão algumas das respostas possíveis para esse tipo de erro no SOF
Android: BitmapFactory.decodeStream () sem memória com um arquivo de 400 KB com heap livre de 2 MB
Como resolver o problema de java.lang.OutOfMemoryError no Android
Android: java.lang.OutOfMemoryError
java.lang.OutOfMemoryError
Solução para OutOfMemoryError: o tamanho do bitmap excede o orçamento da VM
Edit: Dos comentários de @cjnash
Para quem ainda teve falhas depois de adicionar essa linha, tente colocar sua imagem na pasta res / drawable-xhdpi / em vez de res / drawable-xhdpi /, em vez de res / drawable /, e isso pode resolver o problema.
fonte
você tentou adicionar isso ao seu manifesto em aplicativos?
android:largeHeap="true"
?como isso
fonte
Para mim, o problema era que meu arquivo .png estava sendo descompactado para ser um bitmap realmente enorme na memória, porque a imagem tinha dimensões muito grandes (mesmo que o tamanho do arquivo fosse pequeno).
Portanto, a correção foi simplesmente redimensionar a imagem :)
fonte
android:hardwareAccelerated="false"
, algumas animações como a sombra do layout não estavam funcionando. Mas depois de redimensionar todos os problemas foram resolvidos, obrigado! +1 para esta dica!Na verdade, você pode adicionar no seu manifesto essas linhas
android:hardwareAccelerated="false"
,android:largeHeap="true"
ele está funcionando para algumas situações, mas esteja ciente de que a outra parte do código pode estar discutindo isso.fonte
Isso deve funcionar
fonte
Redimensione sua imagem antes da configuração para o ImageView da seguinte maneira:
onde size é o tamanho real do ImageView. Você pode atingir o tamanho medindo:
e use o próximo tamanho
imageView.getMeasuredWidth()
eimageView.getMeasuredHeight()
parascaling
.fonte
Use Glide Library e Override size para menos tamanho;
fonte
Fiquei abaixo do erro
depois de adicionar
android:largeHeap="true"
em AndroidManifest.xml então eu livrar de todos os errosfonte
Resolvi esse problema redimensionando a imagem para um tamanho menor. Estou usando o formulário xamarin. diminuir o tamanho da imagem PNG resolveu o problema.
fonte
Solução: 1. abra o arquivo de manifesto 2. dentro da tag do aplicativo, basta adicionar abaixo de duas linhas
Exemplo:
fonte
Descobri que as imagens na pasta 'drawable' serão convertidas em uma imagem muito maior em telefones de alta definição. Por exemplo, uma imagem de 200k será reamostrada para uma resolução mais alta, como 800k ou 32000k. Eu tive que descobrir isso sozinho e, até o momento, não vi documentação para essa armadilha de memória heap. Para evitar isso, coloquei tudo em uma pasta drawable-nodpi (além de usar 'opções' no BitmapFactory com base no heap do dispositivo específico). Não posso me dar ao luxo de ter o tamanho do meu aplicativo inchado com várias pastas desenháveis, principalmente porque a variedade de configurações de tela é tão vasta agora. O mais complicado é que o estúdio agora não indica especificamente a pasta 'drawable-nodpi', como tal, na visualização do projeto, apenas mostra uma pasta 'drawable'. Se você não tomar cuidado, quando você solta uma imagem nesta pasta no estúdio, ela ganha '
Certifique-se de clicar na pasta nodpi na caixa de diálogo, pois a exibição do projeto não mostra todas as pastas desenháveis separadamente, como costumava ser, para que não fique imediatamente claro que foi uma errada. O Studio recriou a baunilha 'drawable' em algum momento para mim depois que eu a havia excluído há muito tempo:
fonte
Isso funcionou para mim: basta mover imagens da pasta drawable para drawable-hdpi.
fonte
Soluton, tente isso em seu arquivo de manifesto e use a Biblioteca Glide
compile 'com.github.bumptech.glide: glide: 3.7.0'
android: hardwareAccelerated = "false"
android: largeHeap = "true"
Use esta biblioteca
Sua codificação feliz de trabalho
fonte
adicionar isso ao seu manifesto em aplicativos? android: largeHeap = "true"
fonte
Eu também tive o problema.
Mesmo com a maioria dos outros acima. O problema é causado por uma imagem enorme.
Apenas redimensione algumas imagens e não é necessário alterar nenhum código.
fonte
Em alguns casos (por exemplo, operações em loop), o coletor de lixo é mais lento que o seu código. Você pode usar um método auxiliar nesta resposta para aguardar o coletor de lixo .
fonte
Eu sou um novato no desenvolvimento Android, mas espero que minha solução ajude, funcione perfeitamente na minha condição. Estou usando o Imageview e defina seu plano de fundo como "src" porque estou tentando fazer uma animação de quadro. Eu recebi o mesmo erro, mas quando tentei codificar isso funcionou
fonte
Eu me deparei com esse problema quando não acabei com minha antiga atividade ao passar para uma nova atividade. Eu consertei com
finish();
fonte
50/100, se alguém usar 100, a resolução original poderá parar os aplicativos por falta de memória.
se 50 ou menos que 100, essa será uma resolução de 50% ou menos que 100, portanto, isso evitará problemas de falta de memória
fonte
Você precisa alterar o tamanho do objeto no drawable. É muito grande para o Android exibir. Por exemplo, se você estiver configurando uma imagem, tente uma imagem com menos pixels. Funciona para mim. Obrigado. :)
fonte
Seu aplicativo está travando porque o tamanho da sua imagem (em MB ou KB) é muito grande e, portanto, não está alocando espaço para isso. Portanto, antes de colar sua imagem no drawable, reduza o tamanho.
OU
Você pode adicionar o seguinte na tag do aplicativo em Manifest.xml
Depois de adicionar este aplicativo não irá falhar.
fonte
Meu problema foi resolvido após adicionar
no arquivo Build.Gradle
fonte
fonte
Se estiver carregando uma imagem, tente reduzir a qualidade da imagem, que é o segundo parâmetro do Bitmap. Esta foi a solução no meu caso. Anteriormente, era 90, então tentei com 60 (como está no código abaixo agora).
fonte
Experimente o mais simples. Talvez o seu aplicativo esteja travando porque o tamanho da imagem (em MB) é muito grande e, portanto, não está alocando espaço para isso. Portanto, antes de colar sua imagem no drawable, reduza o tamanho de qualquer software visualizador ou, se você estiver tirando uma imagem da galeria em tempo de execução, antes de salvá-la, comprima seu bitmap. Funcionou para mim. definitivamente para você será.
fonte
Em seguida, na tag Appliaction, adicione largeheapsize = "true
fonte
Suponho que você queira usar esta imagem como um ícone. Como o Android está dizendo, sua imagem é muito grande. O que você só precisa fazer é dimensionar sua imagem para que o Android saiba qual tamanho da imagem usar e quando de acordo com a resolução da tela. Para fazer isso, no Android Studio: 1. clique com o botão direito do mouse na pasta res, 2. selecione Image Asset 3. Select icon Type 4. Dê um nome ao ícone 5. Select Image on Asset Type 6. Apare sua imagem Clique em Avançar e termine . No seu código-fonte ou xml, consulte a imagem que agora estará localizada na pasta layout ou mipmap, de acordo com o tipo de ativo selecionado. O erro desaparecerá.
fonte
Eu realmente não recomendo editar manifestos como este
Essas opções causam um efeito de animação não suave no seu aplicativo. Além disso, 'liveData' ou alterando seu banco de dados local (Sqlite, Room) são ativados lentamente. É ruim para a experiência do usuário.
Então, eu recomendo o RESIZE bitmap
Abaixo está o código de exemplo
fonte
Se android: largeHeap = "true" não funcionou para você,
1:
2:
Não remova android: largeHeap = "true"!
fonte
Use uma biblioteca de carregamento de imagens como Picasso ou Glide . O uso dessas bibliotecas evitará falhas no futuro.
fonte