web-dev-qa-db-fra.com

Échec de la transaction de reliure lors de l'insertion dynamique d'un bitmap dans un widget

Quelqu'un peut-il me dire la raison de transaction de classeur ayant échoué erreur? Je peux voir ce message d'erreur dans logcat. Je reçois cette erreur en essayant de mettre une image bitmap dynamiquement dans un widget ...

115
Eby

Cela est dû au fait que toutes les modifications apportées à RemoteViews sont sérialisées (par exemple, setInt et setImageViewBitmap). Les bitmaps sont également sérialisés dans un ensemble interne. Malheureusement, ce paquet a une très petite taille limite.

Vous pouvez le résoudre en réduisant la taille de l’image de la manière suivante:

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

Choisissez newHeight pour être assez petit (~ 100 pour chaque case à afficher à l'écran) et utilisez-le pour votre widget, et votre problème sera résolu :)

90
GalDude33

Vous pouvez compresser le bitmap en tant que tableau d'octets, puis le décompresser dans une autre activité, comme celle-ci.

Compresse!!

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

Décompressez !!

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

Le tampon de transaction du classeur a une taille fixe limitée, actuellement de 1 Mo, partagée par toutes les transactions en cours du processus. Par conséquent, cette exception peut être levée lorsque plusieurs transactions sont en cours, même lorsque la plupart des transactions individuelles sont de taille modérée.

référez-vous ceci lien

37
dharam

Voir ma réponse dans this thread.

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

Vous dépassez le tampon de transaction du classeur en transférant un ou plusieurs éléments volumineux d’une activité à une autre.

12
Balaji Dubey

J'ai résolu ce problème en stockant des images sur la mémoire interne, puis en utilisant .setImageURI () plutôt que .setBitmap ().

8
MartinC

La bonne approche consiste à utiliser setImageViewUri() (plus lent) ou setImageViewBitmap() et à recréer RemoteViews chaque fois que vous mettez à jour la notification.

3
Alexander Woodblock