Ich möchte das Bitmap - Bild in ImageView von der bereits gespeicherten SD-Karte anzeigen. Nach dem Ausführen ist meine Anwendung abgestürzt und der OutOfMemoryError -Fehler wird angezeigt:
(Java.lang.OutOfMemoryError: Fehler beim Zuordnen einer 23970828-Byte-Zuordnung mit 2097152 freien Bytes und 2 MB bis zur OOM).
Ich habe keine Ahnung oder warum es aus dem Gedächtnis ist. Ich denke, dass meine Bildgröße sehr groß ist, also versuchte ich, sie zu ändern.
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);
Die Log-Cat-Informationen:
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)
OutOfMemoryError ist das häufigste Problem, das in Android auftritt, insbesondere bei Bitmaps. Dieser Fehler wird von der Java Virtual Machine (JVM) ausgelöst, wenn ein Objekt aufgrund mangelnden Speicherplatzes nicht zugewiesen werden kann und der Garbage Collector keinen Speicherplatz freigeben kann.
Wie von Aleksey erwähnt, können Sie in Ihrer Manifestdatei Android:hardwareAccelerated="false"
, Android:largeHeap="true"
unten Entitäten hinzufügen. Dies funktioniert für einige Umgebungen.
<application
Android:allowBackup="true"
Android:hardwareAccelerated="false"
Android:icon="@mipmap/ic_launcher"
Android:label="@string/app_name"
Android:largeHeap="true"
Android:supportsRtl="true"
Android:theme="@style/AppTheme">
sie sollten definitiv einige Androids Developer-Konzepte lesen, insbesondere hier: Bitmaps effizient anzeigen
Lesen Sie alle 5 Themen und schreiben Sie Ihren Code erneut. Wenn es immer noch nicht funktioniert, werden wir uns freuen zu sehen, was Sie mit dem Tutorial-Material falsch gemacht haben.
Hier einige mögliche Antworten auf diese Art von Fehlern in SOF
So lösen Sie Java.lang.OutOfMemoryError-Probleme in Android
Android: Java.lang.OutOfMemoryError
Lösung für OutOfMemoryError: Die Bitmap-Größe überschreitet das Budget von VM
Bearbeiten: Aus den Kommentaren von @cjnash
Wenn Sie nach dem Hinzufügen dieser Zeile immer noch Abstürze hatten, versuchen Sie, Ihr Bild in Ihren res/drawable-xhdpi/-Ordner anstatt in res/drawable/zu kopieren, wodurch das Problem möglicherweise behoben wird.
haben Sie versucht, dies unter Anwendungen zu Ihrem Manifest hinzuzufügen? Android:largeHeap="true"
?
so was
<application
Android:name=".ParaseApplication"
Android:allowBackup="true"
Android:icon="@mipmap/ic_launcher"
Android:label="@string/app_name"
Android:theme="@style/AppTheme"
Android:largeHeap="true" >
Tatsächlich können Sie diese Zeilen Android:hardwareAccelerated="false"
, Android:largeHeap="true"
in einigen Fällen in Ihr Manifest einfügen. Beachten Sie jedoch, dass der andere Teil des Codes damit argumentieren kann.
<application
Android:allowBackup="true"
Android:hardwareAccelerated="false"
Android:icon="@mipmap/ic_launcher"
Android:label="@string/app_name"
Android:largeHeap="true"
Android:supportsRtl="true"
Android:theme="@style/AppTheme">
Für mich bestand das Problem darin, dass meine PNG-Datei dekomprimiert wurde, um eine wirklich große Bitmap im Speicher zu sein, da das Bild sehr große Abmessungen hatte (obwohl die Dateigröße klein war).
Das Problem bestand also darin, das Bild einfach zu verkleinern :)
Das sollte funktionieren
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 8;
mBitmapInsurance = BitmapFactory.decodeFile(mCurrentPhotoPath,options);
Verwenden Sie Glide Library und überschreiben Sie die Größe mit einer geringeren Größe.
Glide.with(mContext).load(imgID).asBitmap().override(1080, 600).into(mImageView);
Größe ändern Ihr Bild vor dem Einrichten von ImageView folgendermaßen:
Bitmap.createScaledBitmap(_yourImageBitmap, _size, _size, false);
wobei size die tatsächliche Größe von ImageView ist. Sie können die Größe erreichen, indem Sie Folgendes messen:
imageView.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
und verwenden Sie die nächste Größe imageView.getMeasuredWidth()
und imageView.getMeasuredHeight()
für scaling
.
Ich habe dieses Problem gelöst, indem ich die Größe des Bildes verkleinerte. Ich verwende Xamarin-Form. Durch die Verringerung der Größe des PNG-Bildes wurde das Problem behoben.
Ich habe unter Fehler bekommen
"E/art: OutOfMemoryError werfen" Fehler beim Zuweisen eines 47251468-Byte Zuweisung mit 16777120 freien Bytes und 23 MB bis OOM "
nach dem Hinzufügen von Android:largeHeap="true"
in AndroidManifest.xml dann habe ich alle Fehler beseitigt
<application
Android:allowBackup="true"
Android:icon="@mipmap/guruji"
Android:label="@string/app_name"
Android:supportsRtl="true"
Android:largeHeap="true"
Android:theme="@style/AppTheme">
Problem: Zuweisung einer 37748748-Byte-Zuordnung mit 16777120 .__ ist fehlgeschlagen. freie Bytes und 17 MB bis OOM
Lösung: 1.Öffnen Sie Ihre Manifestdatei 2. innerhalb des Anwendungs-Tags fügen Sie einfach zwei Zeilen hinzu
Android:hardwareAccelerated="false"
Android:largeHeap="true"
Beispiel:
<application
Android:allowBackup="true"
Android:hardwareAccelerated="false"
Android:largeHeap="true"
Android:icon="@mipmap/ic_launcher"
Android:label="@string/app_name"
Android:roundIcon="@mipmap/ic_launcher_round"
Android:supportsRtl="true"
Android:theme="@style/AppTheme">
Soluton probiere dies in deiner Manifest-Datei und benutze Glide Library
kompiliere "com.github.bumptech.glide: glide: 3.7.0"
**Use Glide Library and Override size to less size;**
if (!TextUtils.isEmpty(message.getPicture())) {
Glide.with(mContext).load(message.getPicture())
.thumbnail(0.5f)
.crossFade()
.transform(new CircleTransform(mContext))
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(holder.imgProfile);
}
Android: hardwareAccelerated = "false"
Android: largeHeap = "true"
<application
Android:allowBackup="true"
Android:hardwareAccelerated="false"
Android:icon="@mipmap/ic_launcher"
Android:label="@string/app_name"
Android:largeHeap="true"
Android:supportsRtl="true"
Android:theme="@style/AppTheme">
Verwenden Sie diese Bibliothek
compile 'com.github.bumptech.glide:glide:3.7.0'
Seine Arbeit glücklich Codierung
import Android.content.Context;
import Android.graphics.Bitmap;
import Android.graphics.BitmapShader;
import Android.graphics.Canvas;
import Android.graphics.Paint;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;
public class CircleTransform extends BitmapTransformation {
public CircleTransform(Context context) {
super(context);
}
@Override
protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
return circleCrop(pool, toTransform);
}
private static Bitmap circleCrop(BitmapPool pool, Bitmap source) {
if (source == null) return null;
int size = Math.min(source.getWidth(), source.getHeight());
int x = (source.getWidth() - size) / 2;
int y = (source.getHeight() - size) / 2;
// TODO this could be acquired from the pool too
Bitmap squared = Bitmap.createBitmap(source, x, y, size, size);
Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888);
if (result == null) {
result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
}
Canvas canvas = new Canvas(result);
Paint paint = new Paint();
Paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
Paint.setAntiAlias(true);
float r = size / 2f;
canvas.drawCircle(r, r, r, Paint);
return result;
}
@Override
public String getId() {
return getClass().getName();
}
}
Ich hatte auch das Problem.
Dasselbe gilt für die meisten anderen über ... Das Problem wird durch ein großes Bild verursacht.
Ändern Sie einfach die Größe einiger Bilder, Sie müssen keinen Code ändern.
Ich bin ein Neuling in der Entwicklung von Android, aber ich hoffe, dass meine Lösung hilft, es funktioniert perfekt für meinen Zustand. Ich benutze Imageview und setze den Hintergrund auf "src", weil ich versuche, eine Frame-Animation zu erstellen. Ich habe den gleichen Fehler erhalten, aber als ich versuchte, das zu kodieren, funktionierte es
int ImageID = this.Resources.GetIdentifier(questionPlay[index].Image.ToLower(), "anim", PackageName);
imgView.SetImageResource(ImageID);
AnimationDrawable animation = (AnimationDrawable)imgView.Drawable;
animation.Start();
animation.Dispose();
Bitmap image =((BitmapDrawable)imageView1.getDrawable()).getBitmap();
ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG,50/100,byteArrayOutputStream);
50/100 Wenn man 100 verwendet, kann die ursprüngliche Auflösung die Apps für nicht genügend Speicher stoppen.
bei einer Auflösung von 50 oder weniger als 100 ist dies eine Auflösung von 50% oder weniger als 100
Mein Problem wurde nach dem Hinzufügen behoben
dexOptions {
incremental true
javaMaxHeapSize "4g"
preDexLibraries true
dexInProcess = true
}
in der Build.Gradle-Datei
Das hat für mich funktioniert: einfach Bilder von drawable nach drawable-hdpi verschieben.
Ich bin auf dieses Problem gestoßen, als ich meine alte Aktivität nicht abgebrochen habe, als ich zu einer neuen Aktivität überging. Ich habe es mit finish();
behoben
Intent goToMain = new Intent(this,MainActivity.class);
startActivity(goToMain);
finish();
Sie müssen die Größe des Objekts in Drawable ändern. Es ist zu groß, um Android anzuzeigen. z.B. Wenn Sie ein Bild einstellen, versuchen Sie ein Bild mit weniger Pixeln. Es funktioniert für mich ... Danke. :)
In einigen Fällen (z. B. Operationen in einer Schleife) ist Garbage Collector langsamer als Ihr Code. Sie können eine helper-Methode aus dieser Antwort verwenden bis wait for Garbage Collector.
Ihre App stürzt ab, weil Ihre Bildgröße (in MB oder KB) zu groß ist , so dass der Speicherplatz nicht zugewiesen wird. Bevor Sie Ihr Bild in ein Zeichen einfügen, müssen Sie nur die Größe reduzieren.
ODER
Sie können Folgendes in application tag unter Manifest.xml hinzufügen
Android:hardwareAccelerated="false"
Android:largeHeap="true"
Android:allowBackup="true"
Nach dem Hinzufügen dieser App stürzt nicht ab.
Ich habe herausgefunden, dass Bilder im "Drawable" -Ordner auf hochauflösenden Telefonen in ein viel größeres Bild umgewandelt werden. Zum Beispiel wird ein 200k-Bild mit einer höheren Auflösung wie 800k oder 32000k erneut abgetastet. Ich musste dies selbst herausfinden und habe bis jetzt keine Dokumentation für diese Heapspeicherfalle gesehen. Um dies zu verhindern, lege ich alles in einen drawable-nodpi-Ordner (zusätzlich zur Verwendung von 'options' in BitmapFactory basierend auf dem jeweiligen Geräteheap). Ich kann es mir nicht leisten, die Größe meiner App mit mehreren gezeichneten Ordnern aufzublähen, zumal der Bereich der Bildschirm-Defs jetzt so groß ist. Das Schwierige ist, dass Studio jetzt den Ordner 'drawable-nodpi' in der Projektansicht nicht speziell angibt, sondern nur einen 'drawable'-Ordner. Wenn Sie nicht aufpassen, wenn Sie ein Bild in diesem Ordner in Studio ablegen, wird es nicht wirklich in das Drawable-Nodpi fallen:
Careful here 'backgroundtest' did not actually go to drawable-nodpi and will
be resampled higher, such as 4x or 16x of the original dimensions for high def screens.
Klicken Sie im Dialogfeld auf den Ordner nodpi, da in der Projektansicht nicht alle gezeichneten Ordner wie zuvor einzeln angezeigt werden. Es ist also nicht sofort ersichtlich, dass ein falscher Ordner erstellt wurde. Das Studio hat die Vanilla 'drawable' irgendwann für mich neu erstellt, nachdem ich sie längst gelöscht hatte:
fügen Sie dies zu Ihrem Manifest unter Anwendungen hinzu? Android: largeHeap = "true"
stream = activity.getContentResolver().openInputStream(uri);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.RGB_565;
bitmap = BitmapFactory.decodeStream(stream, null, options);
int Height = bitmap.getHeight();
int Width = bitmap.getWidth();
enter code here
int newHeight = 1000;
float scaleFactor = ((float) newHeight) / Height;
float newWidth = Width * scaleFactor;
float scaleWidth = scaleFactor;
float scaleHeight = scaleFactor;
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
resizedBitmap= Bitmap.createBitmap(bitmap, 0, 0,Width, Height, matrix, true);
bitmap.recycle();
Fügen Sie dann im Application-Tag largeheap size = "true" hinzu
Wenn Sie ein Bild hochladen, reduzieren Sie die Bildqualität, den zweiten Parameter der Bitmap. Dies war die Lösung in meinem Fall. Früher waren es 90, dann habe ich es mit 60 versucht (so wie es jetzt im Code steht).
Bitmap yourSelectedImage = BitmapFactory.decodeStream(imageStream);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
finalBitmap.compress(Bitmap.CompressFormat.JPEG,60,baos);
byte[] b = baos.toByteArray();
Ich nehme an, Sie möchten dieses Bild als Symbol verwenden. Wie Android Ihnen mitteilt, ist Ihr Bild zu groß. Sie müssen lediglich Ihr Bild skalieren, damit Android weiß, welche Größe des Bildes verwendet werden soll und wann dies der Bildschirmauflösung entspricht. Gehen Sie dazu in Android Studio folgendermaßen vor: 1. Klicken Sie mit der rechten Maustaste auf den Ordner res. 2. Wählen Sie Image Asset. 3. Wählen Sie den Symboltyp. 4. Geben Sie dem Symbol einen Namen. 5. Wählen Sie Image on Asset Type. 6. Schneiden Sie das Bild . Beziehen Sie sich in Ihrer XML-Datei oder Ihrem Quellcode auf das Bild, das sich je nach ausgewähltem Asset-Typ entweder im Layout- oder im Mipmap-Ordner befindet. Der Fehler wird verschwinden.
Versuchen Sie es mit dem einfachsten. Möglicherweise stürzt Ihre App ab, weil Ihre Bildgröße (in MB) zu groß ist und der Speicherplatz hierfür nicht zugewiesen wird. Bevor Sie also Ihr Bild in Drawable einfügen, reduzieren Sie die Größe mit jeder Viewer-Software. Wenn Sie zur Laufzeit ein Bild aus der Galerie erstellen, komprimieren Sie Ihre Bitmap vor dem Speichern. definitiv für dich wird es sein.
Last but not the least....
Try Method One:
Simple Add these lines of code in the gradle file
dexOptions {
incremental true
javaMaxHeapSize "4g"
}
Example:
Android {
compileSdkVersion XX
buildToolsVersion "28.X.X"
defaultConfig {
applicationId "com.example.xxxxx"
minSdkVersion 14
targetSdkVersion 19
}
dexOptions {
incremental true
javaMaxHeapSize "4g"
}
}
*******************************************************************
Method Two:
Add these two lines of code in manifest file...
Android:hardwareAccelerated="false"
Android:largeHeap="true"
Example:
<application
Android:allowBackup="true"
Android:icon="@drawable/ic_launcher"
Android:hardwareAccelerated="false"
Android:largeHeap="true"
Android:label="@string/app_name"
Android:theme="@style/AppTheme" >
<activity
Android:name=".MainActivity"
Android:label="@string/app_name" >
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
It will Work for sure any of these cases.....