一、首先提供需要在activity之间用intent传递较大数据的方法。intent不能传递较大数据,需要传递数据的时候,写一个操作类:
public class DataHelper {private static final DataHelper helper= new DataHelper();public static DataHelper getInstance() {return helper;}Map<String, WeakReference<Object>> data = new HashMap<String, WeakReference<Object>>();public void saveData(String id, Object object) {data.put(id, new WeakReference<Object>(object));}public Object getData(String id) {WeakReference<Object> objectWeakReference = data.get(id);return objectWeakReference.get();}
}
解决!
在群里聊天,有人发了一个kotlin版,我也早就用kotlin了,顺手贴一下:
二、intent不能传递较大数据的原因
Intent携带信息的大小其实是受Binder限制。数据以Parcel对象的形式存放在Binder传递缓存中。如果数据或返回值比传递buffer大,则此次传递调用失败并抛出TransactionTooLargeException异常。Binder传递缓存有一个限定大小,通常是1Mb。但同一个进程中所有的传输共享缓存空间。多个地方在进行传输时,即时它们各自传输的数据不超出大小限制,TransactionTooLargeException异常也可能会被抛出。在使用Intent传递数据时,1Mb并不是安全上限。因为Binder中可能正在处理其它的传输工作。不同的机型和系统版本,这个上限值也可能会不同。在其它地方,例如onSaveInstanceState(@NonNull Bundle outState),也可能会遇到与Binder有关的类似问题。
网上解释的文章很多,最开始不知道是谁写的了,大家都相互复制,在下面贴出两篇解释:
https://juejin.im/post/5caa01b15188254aa83f8154
https://www.jianshu.com/p/deb696063c7d