Activity之间使用intent传递大数据出现Bug及解决方法

        很久很久(大概两个月吧)之前,在项目中遇到了这个问题,就想着要记录一下,然后就拖到了现在。所以本猿(其实人家是媛)得出一个重要推论:不要轻易放弃一个拖延症重患,他想到的一定会做到,只是时间的问题,就是不知道你们等不等的到(此处适合坏笑的表情)。

       当测试找来这个bug的时候,本宝宝一头雾水,没崩,没报啥常规错,只见logcat空余一行:E: !!! FAILED BINDER TRANSACTION !!! (当然是红色)。然后宝宝开始Google,才发现原来是intent传递大容量数据产生的问题,导致新Activity无法启动。问题详细分析请click here

        解决方案,我是采用的静态成员变量方式实现大容量数据传递的(当然也是参考别人的咯,毕竟现在巨人很多,有的是肩膀可站)。具体如下:

这个可以直接在activity中也可以单独一个数据结构体,就和单例差不多了。

比如:

public class DataHolder{

private static String data;

public static String getData(){returndata;}

public static String setData(Stringdata){this.data=data;}

}

启动之前设置数据,新的activity获取数据。

注意:这些情况如果数据很大很多,比如bitmap,处理不当是很容易导致内存泄露或者内存溢出的。

所以可以考虑使用WeakReferences将数据包装起来。

比如:

public class DataHolder{

Map> data = new HashMap();

void save(String id,Object object{

data.put(id,new WeakReference(object));

}

Object retrieve(String id){WeakReference objectWeakReference=data.get(id);

return objectWeakReference.get();}

}

启动之前:

DataHolder.getInstance().save(someId,someObject);

新activity中:

DataHolder.getInstance().retrieve(someId);

这里可能需要通过intent传递id,如果数据唯一,id都可以不传递的。save() retrieve()中id都固定即可。

        最后宝宝要声明:问题是自己遇到的,解决方法是别人的。所以宝宝只是小小的搬运工,公德心还是有的,给你们 -->   解决方法连接

大恩不言谢,所以膝盖什么的就不用送了。

你可能感兴趣的:(Activity之间使用intent传递大数据出现Bug及解决方法)