在AppWidgetManager的Android文档中,它说
The total Bitmap memory used by the RemoteViews object cannot exceed that required
to fill the screen 1.5 times, ie. (screen width x screen height x 4 x 1.5) bytes.
但是TransactionTooLargeException的文档说:
The Binder transaction buffer has a limited fixed size, currently 1Mb, which is
shared by all transactions in progress for the process.
市场上几乎所有的Android设备都有足够大的屏幕尺寸,填充它的Bitmap会超过1Mb(例如800 x 600 x 4 = 1,920,000字节)。我查看了Android平台源代码,它似乎没有使用ashmem管道或任何深奥的东西,只是normal AIDL file而在RemoteViews中Bitmap对象是以正常方式Parcelable(它does drop down to native code但是它似乎将所有Bitmap像素写入常规Parcel)。
那么Android怎么可能超过Binder交易限制? oneway
是否允许发送更大的数据?
答案 0 :(得分:0)
Bitmaps
经过特殊处理。它们在本机内存中,并且仅引用在捆绑包中传递。尝试对byte[]
中的位图进行序列化,我敢打赌它会崩溃。
答案 1 :(得分:-1)
CommonsWare在评论中回答了这个问题,答案是否定的,文档是错误的。
在你的aidl中使用oneway
可能会使你的代码更有可能命中事务太大,因为RPC会在通过绑定器发送的数据被消耗之前立即返回,允许你将更多的数据推送到粘合剂,让你接近或超过极限。