116 votes

Échec de la transaction dans le classeur

Quelqu'un peut-il me dire la raison de l' échec d'une erreur de transaction de classeur ? 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 ...

90voto

GalDude33 Points 2564

Cela est dû au fait que toutes les modifications apportées aux vues 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 :)

63voto

Nicolás Loaiza Points 351

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

37voto

dhams Points 2662

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érer ce lien

8voto

MartinC Points 253

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

3voto

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X