web-dev-qa-db-de.com

Binder-Transaktion fehlgeschlagen, wenn eine Bitmap dynamisch in ein Widget eingefügt wird

Kann mir jemand den Grund für fehlgeschlagene Binder-Transaktion Fehler mitteilen? Ich kann diese Fehlermeldung in logcat sehen. Ich erhalte diesen Fehler beim Versuch, eine Bitmap dynamisch in ein Widget einzufügen ...

115
Eby

Dies liegt daran, dass alle Änderungen an den RemoteViews serialisiert werden (z. B. setInt und setImageViewBitmap). Die Bitmaps werden auch in ein internes Bündel serialisiert. Leider hat dieses Bundle eine sehr kleine Größenbeschränkung.

Sie können das Problem lösen, indem Sie die Bildgröße folgendermaßen verkleinern:

 public static Bitmap scaleDownBitmap(Bitmap photo, int newHeight, Context context) {

 final float densityMultiplier = context.getResources().getDisplayMetrics().density;        

 int h= (int) (newHeight*densityMultiplier);
 int w= (int) (h * photo.getWidth()/((double) photo.getHeight()));

 photo=Bitmap.createScaledBitmap(photo, w, h, true);

 return photo;
 }

Wählen Sie newHeight, um klein genug zu sein (~ 100 für jedes Quadrat, das auf dem Bildschirm angezeigt werden soll), und verwenden Sie es für Ihr Widget, damit Ihr Problem gelöst wird :)

90
GalDude33

Sie können die Bitmap als Byte-Array komprimieren und sie dann in einer anderen Aktivität wie dieser dekomprimieren.

Komprimieren!!

        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
        byte[] bytes = stream.toByteArray(); 
        setresult.putExtra("BMP",bytes);

Dekomprimieren !!

        byte[] bytes = data.getByteArrayExtra("BMP");
        Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
62
Nicolás Loaiza

Der Binder-Transaktionspuffer hat eine begrenzte feste Größe von derzeit 1 MB, die von allen laufenden Transaktionen für den Prozess gemeinsam genutzt wird. Infolgedessen kann diese Ausnahme ausgelöst werden, wenn viele Transaktionen ausgeführt werden, auch wenn die meisten Einzeltransaktionen von mittlerer Größe sind.

verweisen Sie auf diese Link

37
dharam

Siehe meine Antwort in this thread.

intent.putExtra("Some string",very_large_obj_for_binder_buffer);

Sie überschreiten den Binder-Transaktionspuffer, indem Sie große Elemente von einer Aktivität zu einer anderen Aktivität übertragen.

12
Balaji Dubey

Ich habe dieses Problem behoben, indem ich Bilder im internen Speicher gespeichert und dann .setImageURI () anstelle von .setBitmap () verwendet habe.

8
MartinC

Der richtige Ansatz ist, setImageViewUri() (langsamer) oder setImageViewBitmap() zu verwenden und RemoteViews jedes Mal neu zu erstellen, wenn Sie die Benachrichtigung aktualisieren.

3