Activity之间传递大数据问题

本文涉及的产品
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
简介: <p style="color:rgb(51,51,51); font-family:Arial; line-height:26px"><span style="font-size:14px">Android开发人员都知道,Intent适用于在不同的Activity之间传递数据,包括参数、字符串、以及序列化的对象等。但是笔者所做的项目用到了使用Intent 传递Bitmap图片对象,图片的

Android开发人员都知道,Intent适用于在不同的Activity之间传递数据,包括参数、字符串、以及序列化的对象等。但是笔者所做的项目用到了使用Intent 传递Bitmap图片对象,图片的数据量相对来说是比较大的,那么intent能否胜任传递图片的任务呢?

首先很明显bitmap实现了Android中的Parcelable接口,可以序列化。因此理所当然能够通过intent传递,然而图片的大小有没有限制呢?

Bitmap

extends  Object
implements  Parcelable

答案是肯定的,Intent在传递数据时是有大小限制的,这里官方并未详细说明,不过通过实验的方法可以测出数据应该被限制在1MB之内(1024KB),笔者采用的是传递Bitmap的方法,发现当图片大小超过1024(准确地说是1020左右)的时候,程序就会出现闪退、停止运行等异常(不同的手机反应不同),因此可以判断Intent的传输容量在1MB之内。

在Activity或者组件之前传递信息时,一般采用intent绑定bundle的方式传值,但在使用过程中需要注意的是不要用bundle传递大容量数据:

传输一般的数据参数不会用到这么大的数据量,因此intent符合除图片之外的大部分使用场景,请放心使用吧。如果想传递图片那么建议使用其他方式,附录里提供了三种传递图片的方式。

下面谈谈我们如何通过Intent组件传递大数据

传递小的bitmap对象

1。MainActivity中包括一个ImageView;当我们点击ImageView时;把图片传递给另外一个Activity
  MainActivity的主要代码:

复制代码代码如下:

Intent intent=new Intent(MainActivity.this,TranActivity.class);
            intent.putExtra("bitmap", bitmap);
            startActivity(intent);

  biitmap是 在onCreate方法中获得的图片对象 bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
我们点击图片的时候,跳转到TranActivity中;并且传递一个Bitmap作为参数
而对于比较大的数据传递(笔者实验最好不要超过1M),解决的方法如下:

方法一:将需要传递的数据写在临时文件或者数据库中,再跳转到另外一个组件的时候再去读取这些数据信息,这种处理方式会由于读写文件较为耗时导致程序运行效率较低;

方法二:将需要传递的数据信息封装在一个静态的类中(注意当前组件和要跳转到的组件必须属于同一个进程,因为进程之间才能够共享数据),在当前组件中为类设置内容,然后再跳转到的组件中去取,这种处理方式效率很高,但是会破坏程序的独立性。

最后附上传递图片的一些建议:

附1:Android中传递图片的三种方式:

1. 如果是本地res中的资源文件可以用intent.putExtra("id", R.id.xxx);传递一个对应的id过去。在新activity中通过id取出图片。getResources().getDrawable(R.id.xxx);
2. 如果不是本地资源文件或者adapter中没有存储id,可以把drawable转为bitmap,用intent.putExtra("bitmap", bitmap);传递过去。因为intent只能传递实现序列化的类,即继承java 的Serializable接口或者android的Parcelable接口。drawable没有实现该接口所以不能传递。
3. 如果是通过线程什么的从网上拉取的图片,可以定义一个下载的工具类,并定义一个static的静态Map集合,每拉取成功一张图片就把该图片存入Map中作为缓存。key是该图片的拉取地址。然后通过intent把地址传递过去。在新activity中通过该工具类取得静态map,并通过传递过来的地址中map中取出该图片。

附2:Android中获取bitmap尺寸的方法

在不同的API版本中该方法的实现方式不一样,总的来说可以使用一下方法分别适用于api19、api12和更早的api。获得数据的单位是字节,自行转化为KB或MB。

[java]  view plain  copy
  1. public int getBitmapSize(Bitmap bitmap){  
  2.     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){    //API 19  
  3.         return bitmap.getAllocationByteCount();  
  4.     }  
  5.     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR1){//API 12  
  6.         return bitmap.getByteCount();  
  7.     }  
  8.     return bitmap.getRowBytes() * bitmap.getHeight();                //earlier version  
  9. }  

相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
目录
相关文章
|
9月前
|
数据采集 大数据 数据库
数据架构问题之流式架构的典型代表图示有吗
数据架构问题之流式架构的典型代表图示有吗
|
10月前
|
存储 大数据 数据管理
元宇宙与大数据之间存在着紧密的联系,以下是关于它们之间关系的详细阐述:
**元宇宙是融合扩展现实、数字孪生和区块链的虚实融合新形态,特征包括同步拟真、开源创造、永续及闭环经济。大数据则指海量复杂数据集,以其大容量、多样性、高速处理和低价值密度为特点。元宇宙依赖大数据进行用户行为分析、智能决策和经济体系管理,而大数据在元宇宙中找到广泛应用场景,两者相互促进发展。**
|
11月前
|
存储 消息中间件 分布式计算
流计算中的状态管理是什么?请解释其作用和常用方法。
流计算中的状态管理是什么?请解释其作用和常用方法。
145 0
|
11月前
|
运维 Kubernetes Serverless
从 13 个企业关心的问题看懂用云范式的改变
从 13 个企业关心的问题看懂用云范式的改变
|
11月前
|
Java 数据处理 Apache
流计算中的窗口操作是什么?请解释其作用和使用场景。
流计算中的窗口操作是什么?请解释其作用和使用场景。
117 0
Runtime系列:super调用函数本质、isMemberOfClass与isKindOfClass的区别、综合分析【05】
Runtime系列:super调用函数本质、isMemberOfClass与isKindOfClass的区别、综合分析
159 0
Runtime系列:super调用函数本质、isMemberOfClass与isKindOfClass的区别、综合分析【05】
|
Java 开发者
传统属性赋值弊端|学习笔记
快速学习传统属性赋值弊端
144 0
传统属性赋值弊端|学习笔记
|
新零售
IT的本质是什么?
之前研究新零售,注意到银泰百货提出:零售的本质是商品。 商品 > 价格 > 其他服务。 而新零售就是:互联网+零售数据规模化放大零售本质的过程。 除了新零售、还有新制造、新金融、新XX …… 新XX=互联网+XX数据规模化放大XX本质的过程。
1606 0
|
数据采集 大数据 数据挖掘
大数据正在改变人们学习新语言的方式
大数据的应用正在发生变化,并且可能会改变人们学习新语言的方式。事实上,语言是人们所寻求的信息中最复杂却又最受追捧的一种。因为沟通和交流是如此重要,以至于人们积极尝试采用不同的方法来学习一门新语言。而利用大数据访问和处理大量信息的能力,语言可以变得更加易于学习和掌握。
下一篇
oss创建bucket