【发布时间】:2011-04-01 12:29:16
【问题描述】:
谁能告诉我失败的活页夹交易错误的原因?我可以在 logcat 中看到此错误消息。 尝试将位图动态放入小部件时出现此错误...
【问题讨论】:
谁能告诉我失败的活页夹交易错误的原因?我可以在 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;
}
选择足够小的 newHeight(屏幕上的每个正方形约为 100)并将其用于您的小部件,您的问题将得到解决:)
【讨论】:
Binder 事务缓冲区有一个有限的固定大小,目前为 1Mb,由进程正在进行的所有事务共享。因此,当有许多事务正在进行时,即使大多数单个事务的大小适中,也可能会引发此异常。
参考这个link
【讨论】:
我通过将图像存储在内部存储器上然后使用 .setImageURI() 而不是 .setBitmap() 解决了这个问题。
【讨论】:
您可以将位图压缩为一个字节的数组,然后在另一个活动中解压缩它,就像这样。
压缩!!
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);
【讨论】:
正确的方法是使用setImageViewUri()(较慢)或setImageViewBitmap(),并在每次更新通知时重新创建RemoteViews。
【讨论】:
在this 中查看我的答案 线程。
intent.putExtra("Some string",very_large_obj_for_binder_buffer);
通过将大型元素从一个活动传输到另一个活动,您超出了绑定器事务缓冲区。
【讨论】: