将位图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