在将位图动态放置到小部件中时发生绑定器事务失败

117

请问有人能告诉我 绑定事务失败 错误的原因吗?我在logcat中看到了这个错误信息。 当我尝试动态地将一个位图放入小部件时,我遇到了这个错误...

6个回答

92

这是由于对RemoteViews的所有更改都被序列化了(例如setInt和setImageViewBitmap)。位图也被序列化到一个内部包中。不幸的是,这个包有非常小的大小限制。

您可以通过以下方式缩小图像大小来解决此问题:

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

选择一个足够小的新高度(对于每个在屏幕上占据一个方块的部件来说,大约为100),并将其用于您的小部件,您的问题就会得到解决 :)


1
我不太明白这里到底发生了什么。我正在使用一个具有相当大数据集的ViewPager,尽管存在绑定器错误垃圾邮件,但它确实记住了页面之间的所有内容。bundle是否被写入本地存储并进行预取,还是怎么样?如果我添加更多页面,我可能会丢失数据吗? - G_V
7
但这会降低图像质量。 - John Joe

65

您可以将位图压缩为字节数组,然后在另一个活动中进行解压缩,就像这样。

压缩!


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

解压缩!

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

1
完美,这显著减小了位图大小。 - Navin
1
为什么不使用JPEG而是使用PNG呢?JPEG不是压缩得更好吗? - mehmet6parmak
3
PNG被使用是因为它是无损的,不像JPEG。是的,JPEG可以更好地压缩,但质量会有所下降。 - Petzku
对我不起作用 :( https://stackoverflow.com/questions/34540819/still-get-error-failed-binder-transaction-although-have-compressed-it - John Joe
太棒了!这是我正在处理的临时实现的一个很好的解决方法。虽然在使用Bundle/Intent时应避免传递大量数据。 - sud007
bmp 变量是什么? - Paradox

38

Binder事务缓冲区有一个固定的有限大小,目前为1Mb,该大小被进程中所有正在进行的事务共享。因此,即使大多数单个事务都是中等大小,在有许多正在进行的事务时,仍可能抛出此异常。

请参考链接


13

请查看线程中我的回答。

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

你正通过从一个活动向另一个活动传输大的元素来超出binder事务缓冲区的限制。


我遇到了同样的问题,我只是删除了putExtra,问题解决了! - Ivor

8

通过将图像存储在内部存储器上,然后使用.setImageURI()而不是.setBitmap(),我解决了这个问题。


1
不要通过Parcelable从屏幕到屏幕传递图像或其他内容,我想在这种情况下这是最糟糕的。 - MartinC

3
正确的方法是使用setImageViewUri()(较慢)或setImageViewBitmap()并在每次更新通知时重新创建RemoteView

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接