将位图dynamic添加到窗口小部件时失败的绑定事务
有谁可以告诉我失败的联编程序交易错误的原因? 我可以在logcat中看到这个错误信息。 我得到这个错误,同时试图把一个位图dynamic地在一个小部件…
这是因为对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; }
selectnewHeight足够小(对于每个方块应该在屏幕上~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);
Binder事务缓冲区具有有限的固定大小,当前为1Mb,由进程中正在进行的所有事务共享。 因此,即使大多数单个交易的大小适中,当有许多交易正在进行时,这个exception也会被抛出。
参考这个链接
看到我的答案在这个线程。
intent.putExtra("Some string",very_large_obj_for_binder_buffer);
通过将大元素从一个活动转移到另一个活动,您正在超越活页夹事务缓冲区。
我已经通过在内部存储上存储图像,然后使用.setImageURI()而不是.setBitmap()来解决了这个问题。
正确的做法是在每次更新通知时使用setImageViewUri()
(较慢)或setImageViewBitmap()
并重新创buildRemoteView
。