java.lang.OutOfMemoryError beim Konvertieren von über 100 Strings in Bytearrays

Zunächst verstehe ich Fragen zujava.lang.OutOfMemoryError und Bitmaps wurden bereits mehrfach gefragt. Ich habe auch das @ ausgechecBitmaps effizient anzeigen Seite

Mein Anwendungsfall:

Ich speichere zwei unterschiedlich große Bitmaps als Strings in einer SQLite-Datenbank. Die erste Größe der Bitmaps beträgt 50% der Bildschirmbreite und die zweite Größe 100% der Bildschirmbreite.

Ich verwende eine RecyclerView, die die Bilder in ImageViews anzeigt, die entweder 50% oder 100% der Bildschirmbreite ausmachen, sodass die Bitmaps geladen werdensind nicht größer als nötig und haben eine angemessene Größe, bevor die Bilder aus der Datenbank abgerufen werden.

Ich lade auch die Bitmaps mit einer AsyncTask.

Ich habe über 180 verschiedene Elemente in der RecyclerView, sodass insgesamt über 360 Bitmaps (d. H. NumberOfimages * theDifferentSizesOfEachImage) erstellt werden. Ich konvertiere die String-Versionen der Bilder über diesen Code in Byte-Arrays:byte [] byteArray = Base64.decode(encodedString, Base64.DEFAULT);

Das Proble

Die Aktivität konnte über 170 verschiedene Bilder laden, ohne dass dasjava.lang.OutOfMemoryError, es sei denn, ich habe dieselbe Aktivität neu gestartet (z. B. die Aktivität laden, dann die Aktivität neu erstellen, indem Sie erneut in der Navigationsleiste darauf klicken und diesen Vorgang wiederholen) und dasjava.lang.OutOfMemoryError während die Strings in Byte-Arrays konvertiert werden.

Ich konvertiere das Byte-Array in eine Bitmap mit demGleite Bibliothek mit dem folgenden Code:

 Bitmap bitmap = Glide.with(context).load(byteArray).asBitmap()
 .dontTransform().dontAnimate().skipMemoryCache(true)
 .diskCacheStrategy(DiskCacheStrategy.NONE).into(-1, -1).get();

Meine Frage auf den Punkt gebracht

Wie vermeide ich dasjava.lang.OutOfMemoryErrorritt @ auf, während ich die Strings in Byte-Arrays konvertiere?

Hinwei

Nach dem Erstellen einer Bitmap mit Glide rufe ich recycle () für die angegebene Bitmap auf und setze sie dann aufnull.

Ich benutze auch schonandroid:largeHeap="true" in meinem Android Manifest

Danke im Vorau

Bearbeite

So erstelle ich die Bitmap-Zeichenfolgen:

 ByteArrayOutputStream baos = new  ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.WEBP,100, baos);
        byte [] b =baos.toByteArray();
     String bitmapString = Base64.encodeToString(b, Base64.DEFAULT);

Antworten auf die Frage(2)

Ihre Antwort auf die Frage