在做一个图片相关需求时,需要将一张图片进行base64之后,以字符串的形式传给后台;当对图片进行处理完之后,使用Bundle将字符串(三张图进行base64,总共大概1.2M)传递给另一个页面时,出现了以下错误
“
1. The size limit of Intent is still pretty low in Jelly Bean, which is somewhat lower than 1MB
(around 90K), so you should always be cautious about your data length, even if your
application targets only latest Android versions.”
2.The Binder transaction failed because it was too large
突然想起来,bundle的数据传递是有大小限制的,查阅了官方文档,官方解释
“The Binder transaction buffer has a limited fixed size, currently 1Mb, which is shared by all
transactions in progress for the process. Consequently this exception can be thrown when
there are many transactions in progress even when most of the individual transactions are of
moderate size.”
大概意思就是说,这个缓冲区最大1MB,并且这是该进程中所有正在进行中的传输对象所公用的
查看了Bundle源码,并结合stackOverFlow资料,发现有如下解释:
ArrayMap内部是使用两个数组进行数据存储,一个数组记录key的hash值,另一个数组记录value值,内部使用二分法对key进行排序,并使用二分法进行添加、删除、查找数据,因此它只适合于小数据量操作,在数据量较大的情况下它的性能将会退化。而HashMap内部则是数组+链表的结构,在数据量较少的情况下,HashMap的Entry Array比ArrayMap占用更多的内存。
由于使用Bundle的场景大多数为小数据量,所以相比之下,使用ArrayMap保存数据在操作速度和内存占用上都具有优势,因此使用Bundle来传递数据,可以保证更快的速度和更少的内存占用
那么如何解决这个问题呢?,以下是一些推荐的大数据传递的解决办法
使用文件共享的方式,将数据以File形式存储在sd卡,在取的时候再读取,这样很明显的一个问题就是效率低下;
使用数据库,原理其实跟文件共享方式一样,就是本地持久化存储
使用单例,这个没有试过,不做评论
使用Applcation,跟单例原理差不多
使用static,我在项目中使用的这种方式,个人觉得从原理上跟单例类似,static代码块是程序初始化的时候最先初始化的,位于常量池,相比而言是速度最快,效率最高的方式