在做相册多选时,相册选择界面跳转预览界面时需要通过Intent将所有照片的数据传递给PreviewActivity(预览界面),而当数据量大的时候程序会崩溃,错误信息是android.os.TransactionTooLargeException,后来通过查阅官方资料(https://developer.android.com/reference/android/os/TransactionTooLargeException.html)发现Inetent、Bundle等传递数据时有一个缓冲区,而这个缓冲区最大只有1MB,所以当数据量大时会出现如上错误。这个时候就不能通过Intent来传递数据了。可以使用WeakReference将数据临时保存一下,这也不会影响到GC。代码如下:

public class WeakDataHolder {

private static WeakDataHolder instance;

public static WeakDataHolder getInstance(){
        if(instance == null){
            synchronized (WeakDataHolder.class) {
                if (instance == null) {
                    instance = new WeakDataHolder();
                }
            }
        }
        return instance;
    }

private Map<String, WeakReference<Object>> map = new HashMap<>();

/**
     * 数据存储
     * @param id
     * @param object
     */
    public void saveData(String id, Object object) {
        map.put(id, new WeakReference<>(object));
    }

/**
     * 获取数据
     * @param id
     * @return
     */
    public Object getData(String id) {
        WeakReference<Object> weakReference = map.get(id);
        return weakReference.get();
    }

然后在需要传递数据的地方调用save()方法:

// 照片路径集合List<LocalMedia> previewImages;
WeakDataHolder.getInstance().saveData("2", previewImages);

最后在PreviewActivity调用get()方法获取照片数据:

images = (List<LocalMedia>) WeakDataHolder.getInstance().getData("2");
---------------------  
作者:dayun220  
来源:CSDN  
原文:https://blog.csdn.net/dayun220/article/details/77720473  
版权声明:本文为博主原创文章,转载请附上博文链接!

【Android】Intent传递数据量过大的问题android.os.TransactionTooLargeException相关推荐

  1. Android底层隐私数据,Android Intent传递数据底层分析详细介绍_Android_脚本之家

    Android  Intent传递数据底层分析详细介绍 我们知道在Activity切换时,如果需要向下一个ActivityB传递数据,可以借助Intent对象的putExtra方法. 但是不知各位有没 ...

  2. android中intent放数据类型,Android Intent传递数据底层分析详细介绍

    Android  Intent传递数据底层分析详细介绍 我们知道在Activity切换时,如果需要向下一个ActivityB传递数据,可以借助Intent对象的putExtra方法. 但是不知各位有没 ...

  3. android intent传递数据

    说到intent传递数据,其实我是经常用到,不过之前用的都是简单的传递String,int,boolean的简单数据.昨天,我需要传递一个自定义的实体类时,发现自己不会,所以在网上搜索了一些资料,自己 ...

  4. 【转】Android 之最新最全的Intent传递数据方法

    原文地址:https://www.jianshu.com/p/1169dba99261 intent传递数据 为什么要和intent单独拿出来讲,因为Intent传递数据也是非常重要的 一.简单的传递 ...

  5. Android之Intent传递数据

    1.Android中的Intent对象中包含了多个putXXX()方法(如putExtra()方法)用来插入不同类型的额外数据,也包含了多个getXXX()方法(如getStringExtra().g ...

  6. Android学习之利用Intent传递数据

    你能通过这篇文章学习到什么? 1. 利用intent在两个activity之间传递数据 2. 利用intent在两个activity之间传递数据包 3. 利用intent获取到返回数据 很多人在刚开始 ...

  7. 第9条:用生成器表达式来改写数据量较大的列表推导式

    核心知识点: (1)当输入的数据量较大时,列表推导可能会因为占用太多内存而出问题. (2)由生成器表达式所返回的迭代器,可以逐次产生输出值,从而避免内存用量问题. (3)把某个生成器表达式所返回的迭代 ...

  8. Intent传递数据时,可以传递哪些类型数据

    Intent传递数据时,下列的数据类型哪些可以被传递(abcd)(多选) A.Serializable  B.charsequence C.Parcelable  D.Bundle 除了上面的还能传递 ...

  9. rdd数据存内存 数据量_大数据开发-Spark调优常用手段

    Spark调优 spark调优常见手段,在生产中常常会遇到各种各样的问题,有事前原因,有事中原因,也有不规范原因,spark调优总结下来可以从下面几个点来调优. 1. 分配更多的资源 分配更多的资源: ...

最新文章

  1. python公共键_Python利用公共键如何对字典列表进行排序详解
  2. 汇编 div_Solidity汇编开发简明教程
  3. App Class Loader
  4. 我的C#/.NET学习诀窍——LINQPad
  5. unity3d 求两个点长度_三年级上册求组合图形周长专项练习,附答案
  6. C#/.net 中的事件与代理
  7. 算法: 用队列Queue实现栈Stack
  8. git工作流学习记录
  9. MinGW gcc下载链接及sjlj、dwarf、seh异同以及gcc安装
  10. 【多任务模型】Progressive Layered Extraction: A Novel Multi-Task Learning Model for Personalized(RecSys‘20)
  11. 基于Java的网上商城系统
  12. 2022-2028年全球与中国各向异性导电胶行业市场前瞻与投资战略规划分析
  13. 如何用漫画说明 XSS 和 CSRF 的区别?
  14. 08canvas画图
  15. Mackevision 发布 2016 年回顾与展望
  16. Java计算器编程代码
  17. MODBUS调试工具(modscan32)使用说明
  18. java性能调优jstat使用方法
  19. linux内存耗尽实验,linux 内存耗尽的分析
  20. Arduino学习笔记:串口中断

热门文章

  1. js实现桌面录屏功能
  2. Multisim、proteus和protel的区别
  3. 深入浅出HTML(针对后端攻城狮)
  4. OpenCV:07图像轮廓
  5. chocolatey的安装与使用与chocolatey安装失败的解决方法
  6. python end用法_python中end的使用方法
  7. (四)es6 正则的拓展
  8. 中国电信云计算及SDx联合技术开发实验室执行主任王峰:中国电信SDN/NFV实践-从边缘到核心...
  9. 算法思想为什么重要,通过IMDB学习算法的设计思路
  10. 华为云挂载盘配置挂载