天天看点

Activity之间传递大数据问题 Bitmap

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

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

答案是肯定的,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。

public int getbitmapsize(bitmap bitmap){  

    if (build.version.sdk_int >= build.version_codes.kitkat){    //api 19  

        return bitmap.getallocationbytecount();  

    }  

    if (build.version.sdk_int >= build.version_codes.honeycomb_mr1){//api 12  

        return bitmap.getbytecount();  

    return bitmap.getrowbytes() * bitmap.getheight();                //earlier version  

}  

继续阅读