很久很久(大概两个月吧)之前,在项目中遇到了这个问题,就想着要记录一下,然后就拖到了现在。所以本猿(其实人家是媛)得出一个重要推论:不要轻易放弃一个拖延症重患,他想到的一定会做到,只是时间的问题,就是不知道你们等不等的到(此处适合坏笑的表情)。
当测试找来这个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<String, WeakReference<Object>> data = new HashMap<String, WeakReference>();
void save(String id,Object object{
data.put(id,new WeakReference<Object>(object));
}
Object retrieve(String id){WeakReference<Object> objectWeakReference=data.get(id);
return objectWeakReference.get();}
}
启动之前:
DataHolder.getInstance().save(someId,someObject);
新activity中:
DataHolder.getInstance().retrieve(someId);
这里可能需要通过intent传递id,如果数据唯一,id都可以不传递的。save() retrieve()中id都固定即可。
最后宝宝要声明:问题是自己遇到的,解决方法是别人的。所以宝宝只是小小的搬运工,公德心还是有的,给你们 --> 解决方法连接
大恩不言谢,所以膝盖什么的就不用送了。
网友评论