在窗口小部件中动态放置位图时,活页夹事务失败


116

有人可以告诉我粘结剂交易失败的原因吗?我可以在logcat中看到此错误消息。尝试在小部件中动态放置位图时遇到此错误...

Answers:


91

这是因为对RemoteView的所有更改都已序列化(例如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;
 }

选择newHeight足够小(在屏幕上应该为每个正方形大约100个正方形),并将其用于您的小部件,您的问题将得到解决:)


1
我不太了解的是这里到底发生了什么。我使用的ViewPager具有相当大的数据集,尽管活页夹错误是垃圾邮件,但它确实能记住页面之间的所有内容。捆绑软件是否先写入本地存储然后预取?如果添加更多页面,可能会丢失数据吗?
2014年

7
但这会降低图像质量
John Joe

64

您可以将位图压缩为字节数组,然后在另一个活动中将其解压缩,如下所示。

压缩!!

        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
完美,这大大减少了位图的大小。
纳文2014年

1
为什么不使用JPEG而不是PNG?它不是更好压缩吗?
mehmet6parmak 2015年

3
使用@ mehmet6parmak PNG是因为它无损(与JPEG不同)。是的,JPEG压缩效果更好,但是质量(某种程度上)受到影响。
Petzku


荣誉!我正在研究的临时实施的绝佳解决方法。尽管在使用包/意图时应避免传递大量数据。
sud007

37

活页夹事务缓冲区具有有限的固定大小,目前为1Mb,该进程正在进行的所有事务共享该大小。因此,即使有很多事务正在进行,即使有许多事务正在进行,也可能引发此异常。

参考此链接


12

看到我在这个 线程的答案。

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

通过将大型元素从一个活动转移到另一个活动,您已经超出了活页夹交易缓冲区。


我有同样的问题,我只是删除了排序的putExtra问题!
科特迪瓦

8

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


1
并且不要在屏幕之间将图像通过
Parcelable传递,大约

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.