我们平时应用开发跨进程传递数据这个是经常有但是传递的数据量很大甚至超过了允许的最大值导致抛异常这个可能不那么常见。比如发了一个很长的列表或者一个很大的字符串或者发了一张大图都有可能出现异常。
这个问题虽然不常见但是一旦出现一般都很棘手而且一定要解决的啊。我们怎么解决呢怎么样才能突破这个限制呢这是个问题啊我们接下来就来讨论这个问题。
跨进程传递大图我们能想到哪些方案呢
最容易想到的一种就是先给图片保存到文件给路径跨进程传过去对方再从文件给图片decode出来这个方案是可行就是性能不怎么样你能想象我传个大图要好几秒么。
另一种方案就是通过跨进程通信的方式就是不走文件直接走内存这个肯定会快不少。跨进程通信有哪些方式呢
首先Binder性能是可以用起来也方便但是有大小的限制传的数据量大了就会抛异常。Socket或者管道性能不太好涉及到至少两次拷贝。共享内存性能还不错可以考虑关键看怎么实现。总之呢性能是重点考虑的因素。
我们来看通过Binder传图有几种方案一个是通过Intent传图还一个可以通过Binder调用传图。有人说了这两个不是一回事吗通过Intent传图在启动应用组件的时候还不是一个Binder调用但是你试试就会知道通过Intent传大图可能会抛TransactionTooLargeException异常但是通过普通的Binder调用传图就没事这是为什么呢我们来研究一下。
先看Intent传图哈Bundle b = new Bundle();
b.putParcelable("bitmap", mBitmap);
intent.putExtras(b);
再看Binder调用传图Bundle b = new Bundle();
b.putBinder(“binder”, new IRemoteCaller.Stub() {
@Override
public Bitmap getBitmap() {