Je veux montrer l' image Bitmap dans ImageView de la carte SD qui est déjà stockée. Après l'exécution, mon application se bloque et obtient l' erreur OutOfMemoryError de:
(java.lang.OutOfMemoryError: échec de l'allocation d'une allocation d'octets 23970828 avec 2097152 octets libres et 2 Mo jusqu'à MOO)
Je n'ai aucune idée ni pourquoi sa mémoire est insuffisante. Je pense que ma taille d'image est très grande, j'ai donc essayé de la changer.
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);
Les informations de chat de journal:
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
la source
la source
Réponses:
OutOfMemoryError est le problème le plus courant survenu dans Android, en particulier avec les bitmaps. Cette erreur est levée par la machine virtuelle Java (JVM) lorsqu'un objet ne peut pas être alloué en raison d'un manque d'espace mémoire et également, le garbage collector ne peut pas libérer de l'espace.
Comme mentionné par Aleksey, vous pouvez ajouter des entités ci-dessous dans votre fichier manifeste
android:hardwareAccelerated="false"
,android:largeHeap="true"
cela fonctionnera pour certains environnements.vous devriez certainement lire certains des concepts du développeur Androids, spécialement ici: Affichage efficace des bitmaps
Lisez les 5 rubriques et réécrivez votre code à nouveau. Si cela ne fonctionne toujours pas, nous serons heureux de voir ce que vous avez fait de mal avec le matériel didactique.
Voici quelques réponses possibles pour ce type d'erreurs dans SOF
Android: BitmapFactory.decodeStream () manque de mémoire avec un fichier de 400 Ko avec 2 Mo de mémoire libre
Comment résoudre les problèmes java.lang.OutOfMemoryError dans Android
Android: java.lang.OutOfMemoryError
java.lang.OutOfMemoryError
Solution pour OutOfMemoryError: la taille du bitmap dépasse le budget de la machine virtuelle
Edit: D'après les commentaires de @cjnash
Si vous avez encore des plantages après avoir ajouté cette ligne, essayez de coller votre image dans votre dossier res / drawable-xhdpi / au lieu de votre res / drawable / et cela pourrait résoudre votre problème.
la source
avez-vous essayé d'ajouter ceci à votre manifeste sous applications?
android:largeHeap="true"
?comme ça
la source
Pour moi, le problème était que mon fichier .png était décompressé pour être un très gros bitmap en mémoire, car l'image avait de très grandes dimensions (même si la taille du fichier était minuscule).
Le correctif a donc été de simplement redimensionner l'image :)
la source
android:hardwareAccelerated="false"
, certaines animations comme l'ombre de la mise en page ne fonctionnaient pas. Mais après avoir redimensionné tous les problèmes ont été résolus merci! +1 pour cet indice!En fait, vous pouvez ajouter dans votre manifeste ces lignes
android:hardwareAccelerated="false"
,android:largeHeap="true"
cela fonctionne pour certaines situations, mais sachez que l'autre partie du code peut être en désaccord avec cela.la source
Cela devrait fonctionner
la source
Redimensionnez votre image avant de configurer ImageView comme ceci:
où taille est la taille réelle d'ImageView. Vous pouvez atteindre la taille en mesurant:
et utilisez la taille suivante
imageView.getMeasuredWidth()
etimageView.getMeasuredHeight()
pourscaling
.la source
Utilisez Glide Library et Override size pour réduire la taille;
la source
Je suis en dessous de l'erreur
après avoir ajouté
android:largeHeap="true"
dans AndroidManifest.xml, je me débarrasse de toutes les erreursla source
Solution: 1. ouvrez votre fichier manifeste 2. à l'intérieur de la balise d'application, ajoutez simplement ci-dessous deux lignes
Exemple :
la source
J'ai résolu ce problème en redimensionnant l'image à une taille inférieure. J'utilise le formulaire xamarin. la diminution de la taille de l'image PNG a résolu le problème.
la source
J'ai constaté que les images du dossier «dessinable» seront converties en une image beaucoup plus grande sur les téléphones haute définition. Par exemple, une image de 200k sera rééchantillonnée à une résolution plus élevée, comme 800k ou 32000k. J'ai dû le découvrir par moi-même et à ce jour, je n'ai pas vu de documentation pour ce piège de mémoire de tas. Pour éviter cela, je mets tout dans un dossier drawpi-nodpi (en plus d'utiliser les «options» dans BitmapFactory en fonction du tas de périphérique particulier). Je ne peux pas me permettre d'avoir la taille de mon application gonflée de plusieurs dossiers à dessiner, d'autant plus que la gamme de paramètres d'écran est si vaste maintenant. La chose délicate est que le studio n'indique pas spécifiquement le dossier 'drawable-nodpi' en tant que tel dans la vue du projet, il montre juste un dossier 'drawable'. Si vous ne faites pas attention, lorsque vous déposez une image dans ce dossier en studio, elle a gagné '
Assurez-vous de cliquer sur le dossier nodpi dans la boîte de dialogue, car la vue du projet ne vous montrera pas tous les dossiers dessinables séparément comme auparavant, il ne sera donc pas immédiatement évident qu'il s'est trompé. Studio a recréé la vanille `` dessinable '' à un moment donné pour moi après l'avoir supprimée il y a longtemps:
la source
Cela a fonctionné pour moi: il suffit de déplacer les images du dossier drawable vers drawable-hdpi.
la source
Soluton essayez ceci dans votre fichier manifeste et utilisez la bibliothèque Glide
compilez 'com.github.bumptech.glide: glide: 3.7.0'
android: hardwareAccelerated = "false"
android: largeHeap = "true"
Utilisez cette bibliothèque
Son travail Happy Coding
la source
l'ajouter à votre manifeste sous applications? android: largeHeap = "true"
la source
J'ai aussi eu le problème.
Même chose avec la plupart des autres ci-dessus. Le problème est dû à une image énorme.
Redimensionnez simplement certaines images et ne modifiez aucun code.
la source
Dans certains cas (par exemple les opérations dans une boucle), le garbage collector est plus lent que votre code. Vous pouvez utiliser une méthode d'assistance à partir de cette réponse pour attendre le garbage collector .
la source
Je suis un débutant dans le développement Android, mais j'espère que ma solution aide, cela fonctionne parfaitement dans mon état. Im utilisant Imageview et définissez son arrière-plan sur "src" parce que j'essaie de faire une animation d'image. J'ai eu la même erreur mais quand j'ai essayé de coder ça, ça a marché
la source
J'ai rencontré ce problème lorsque je n'ai pas tué mon ancienne activité en passant à une nouvelle activité. Je l'ai réparé avec
finish();
la source
50/100 si l'on utilise 100, la résolution d'origine peut arrêter les applications pour mémoire insuffisante.
si 50 ou moins de 100, ce sera une résolution de 50% ou moins de 100, donc cela évitera un problème de mémoire insuffisante
la source
Vous devez changer la taille de l'objet en dessinable. Il est trop grand pour être affiché sur Android. Par exemple, si vous définissez une image, essayez une image avec moins de pixels. Ça marche pour moi. Merci. :)
la source
Votre application se bloque car la taille de votre image (en Mo ou en Ko) est trop grande , elle n'alloue donc pas d'espace pour cela. Donc, avant de coller votre image en dessin, réduisez simplement la taille.
OU
Vous pouvez ajouter le suivi dans la balise d'application sur Manifest.xml
Après avoir ajouté cette application ne se bloquera pas.
la source
Mon problème résolu après l'ajout
dans le fichier Build.Gradle
la source
la source
Si vous téléchargez une image, essayez de réduire la qualité de l'image, qui est le deuxième paramètre du bitmap. C'était la solution dans mon cas. Auparavant, c'était 90, puis j'ai essayé avec 60 (comme c'est le cas dans le code ci-dessous maintenant).
la source
Essayez le plus simple. Peut-être que votre application se bloque parce que la taille de votre image (en Mo) est trop grande donc elle n'alloue pas d'espace pour cela. Donc, avant de coller votre image dans un dessin, réduisez simplement la taille par n'importe quel logiciel de visualisation ou si vous prenez une image de la galerie au moment de l'exécution, avant de l'enregistrer, compressez votre bitmap. Ça a marché pour moi. certainement pour vous.
la source
Ensuite, dans la balise Appliaction, ajoutez largeheapsize = "true
la source
Je suppose que vous voulez utiliser cette image comme icône. Comme Android vous le dit, votre image est trop grande. Il vous suffit de mettre votre image à l'échelle afin qu'Android sache quelle taille de l'image utiliser et quand en fonction de la résolution de l'écran. Pour cela, dans Android Studio: 1. faites un clic droit sur le dossier res, 2. sélectionnez Image Asset 3. Sélectionnez l'icône Type 4. Donnez un nom à l'icône 5. Sélectionnez Image sur Asset Type 6. Découpez votre image Cliquez sur Next et terminez . Dans votre code XML ou source, il vous suffit de vous référer à l'image qui sera désormais située soit dans la mise en page, soit dans le dossier mipmap selon le type d'actif sélectionné. L'erreur disparaîtra.
la source
Je ne recommande pas vraiment d'éditer un manifeste comme celui-ci
Ces options provoquent un effet d'animation non fluide sur votre application. De plus, 'liveData' ou la modification de votre base de données locale (Sqlite, Room) s'activent lentement. C'est mauvais pour l'expérience utilisateur.
Je recommande donc de redimensionner le bitmap
Voici l'exemple de code
la source
Si android: largeHeap = "true" ne fonctionnait pas pour vous, alors
1:
2:
Ne supprimez pas android: largeHeap = "true"!
la source
Utilisez une bibliothèque de chargement d'images comme Picasso ou Glide . L'utilisation de ces bibliothèques empêchera les plantages à l'avenir.
la source