Fehlgeschlagene Bindertransaktion beim dynamischen Platzieren einer Bitmap in einem Widget

Kann mir jemand den Grund für einen errorshaften Bindertransaktionserrors mitteilen? Ich kann diese Fehlermeldung in logcat sehen. Ich erhalte diesen Fehler, wenn ich versuche, eine Bitmap dynamisch in ein Widget einzufügen …

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

Sie können es lösen, indem Sie die Bildgröße auf diese Weise 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 es auf dem Bildschirm nehmen sollte) und verwenden Sie es für Ihr Widget, und Ihr Problem wird getriggers 🙂

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

Kompresse!!

  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); 

Der Binder-Transaktionspuffer hat eine begrenzte feste Größe, derzeit 1 MB, die von allen laufenden Transaktionen für den process geteilt wird. Folglich kann diese Ausnahme ausgetriggers werden, wenn viele Transaktionen in Bearbeitung sind, selbst wenn die meisten der einzelnen Transaktionen von mittlerer Größe sind.

Verweise diesen Link

Sehen Sie meine Antwort in diesem 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 in eine andere übertragen.

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

Der richtige Ansatz besteht darin, setImageViewUri() (langsamer) oder setImageViewBitmap() und RemoteView jedes Mal neu zu RemoteView wenn Sie die Benachrichtigung aktualisieren.