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<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都固定即可。

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,899评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,323评论 19 139
  • 一、继承结构 java.lang.object-->android.content.Context-->and...
    supory阅读 5,299评论 1 3
  • 16.4Activity数据传递 16.4.1数据传递媒介 16.4.1.1 通过Intent传递数据 (1)直接...
    xjbclz阅读 2,629评论 0 0
  • 他喜欢你,但一点也不妨碍他也喜欢别人。 在最好的年级,遇见最好的自己,便不是辜负青春。 等不到的你,也许真的是有缘...
    萧萧暮雪阅读 2,635评论 6 1