请问有人能告诉我 绑定事务失败 错误的原因吗?我在logcat中看到了这个错误信息。 当我尝试动态地将一个位图放入小部件时,我遇到了这个错误...
这是由于对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),并将其用于您的小部件,您的问题就会得到解决 :)
您可以将位图压缩为字节数组,然后在另一个活动中进行解压缩,就像这样。
压缩!
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);
bmp
变量是什么? - ParadoxBinder事务缓冲区有一个固定的有限大小,目前为1Mb,该大小被进程中所有正在进行的事务共享。因此,即使大多数单个事务都是中等大小,在有许多正在进行的事务时,仍可能抛出此异常。
请参考链接
请查看此线程中我的回答。
intent.putExtra("Some string",very_large_obj_for_binder_buffer);
你正通过从一个活动向另一个活动传输大的元素来超出binder事务缓冲区的限制。
通过将图像存储在内部存储器上,然后使用.setImageURI()而不是.setBitmap(),我解决了这个问题。
setImageViewUri()
(较慢)或setImageViewBitmap()
并在每次更新通知时重新创建RemoteView
。