将位图动态放入小部件时失败的活页夹事务

Posted

技术标签:

【中文标题】将位图动态放入小部件时失败的活页夹事务【英文标题】:Failed binder transaction when putting an bitmap dynamically in a widget 【发布时间】:2011-04-01 12:29:16 【问题描述】:

谁能告诉我失败的活页夹交易错误的原因?我可以在 logcat 中看到此错误消息。 尝试将位图动态放入小部件时出现此错误...

【问题讨论】:

【参考方案1】:

这是因为对 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;
 

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

【讨论】:

我不太明白这里到底发生了什么。我正在使用具有相当大数据集的 ViewPager,但它确实记住了页面之间的所有内容,尽管存在活页夹错误垃圾邮件。捆绑包是否被写入本地存储然后预取或什么?如果我添加更多页面,我可能会丢失数据吗? 但是这样会降低画质【参考方案2】:

Binder 事务缓冲区有一个有限的固定大小,目前为 1Mb,由进程正在进行的所有事务共享。因此,当有许多事务正在进行时,即使大多数单个事务的大小适中,也可能会引发此异常。

参考这个link

【讨论】:

【参考方案3】:

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

【讨论】:

并且不要通过 Parcelable 将图像从一个屏幕传递到另一个屏幕左右,我想在这种情况下这是最糟糕的【参考方案4】:

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

压缩!!

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

【讨论】:

完美,这大大减小了位图大小。 为什么不使用 JPEG 而不是 PNG?压缩起来不是更好吗? @mehmet6parmak 使用 PNG 是因为它是无损的,与 JPEG 不同。是的,JPEG 压缩得更好,但质量(有点)因此受到影响。 对我不起作用 :( ***.com/questions/34540819/… 赞!我正在从事的临时实施的绝佳解决方法。尽管在使用 Bundles/Intents 时应避免传递大量数据。【参考方案5】:

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

【讨论】:

【参考方案6】:

在this 中查看我的答案 线程。

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

通过将大型元素从一个活动传输到另一个活动,您超出了绑定器事务缓冲区。

【讨论】:

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

以上是关于将位图动态放入小部件时失败的活页夹事务的主要内容,如果未能解决你的问题,请参考以下文章

android小部件中的绑定器事务失败[重复]

更新大量小部件位图时避免 FAILED BINDER TRANSACTION 错误

Android:将位图从本地存储加载到应用小部件(RemoteViews)

Android 小部件位图大小

小部件更新的 RemoteViews 超出最大位图内存使用错误

如何将 WT 小部件放入 PDF?