Activity使用Intent传递大数据问题总结

Activity传递数据的方式

一般来说从Activity A跳转到Activity B时,如果需要传递数据,我们都会使用Intent或者是bundle的方式。举个例子:

Intent Intent = new Intent(Activity A.this, Activity B.class);

intent.putExtra("abc", "I am a String");

intent.putExtra("list", dataList);

如果上面的dataList数据过大,比如超过了1M,则会出现crash,而Activity B的onCreate都不会执行到。我在项目中遇到的一个问题是,查看相册中的某一张图的大图,我要将所有图片的路径全部传递过去,而当有几千张图片的时候,数据超过了1M,则出现了启动crash异常。

官方文档有提到说该异常是TransactionTooLargeException,即传递数据数据过大异常。并且有提到一句话“Parcel objects stored in the Binder transaction buffer”,这表明实际上底层parcel对象在不同activity直接传递过程中保存在一个叫做“Binder transaction buffer”的地方,既然是缓冲区,肯定有大小限制。

解决方法

既然传递的数据有大小限制,那么我们就不能使用Intent的方式进行传输了。

所以我们自定义了一个静态类DataHolder,并且设置setData和getData方法,而且考虑到极端的情况,有可能传递的对象的内存是极其大的,所以为了不造成内存泄漏,我们将要传递的对象构造成一个弱引用保存到该静态类。下面是DataHolder的代码:

public class DataHolder {

    private Map dataList = new HashMap<>();

    private static volatile DataHolder instance;

    public static DataHolder getInstance() {

       if(instance==null) {

            synchronized(DataHolder.class) {

                if(instance==null) {

                     instance = new DataHolder();

                }

           }

       }

       return instance;

    }

    public void setData(String key, Object o) {

        WeakReference value =new WeakReference<>(o);

        dataList.put(key, value);

    }

    public Object getData(String key) {

          WeakReference reference =dataList.get(key);

          if(reference !=null) {

              Object o = reference.get();

              return o;

          }

          return null;

      }

}

以后我们在要传递大数据时,则可以用DataHolder.setData(name, value)进行传递,然后在目标Activity中使用DataHolder.getData(name)进行获取。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值