Android 不同版本下Bitmap创建差异

原创 2013年12月04日 11:04:01

1.问题描述

一个雪花效果,在Android4.0以下系统正常运行,但是在Android4.1上异常退出。

2.问题定位

看一段代码

    private Bitmap		mflakeImage		= null;
    private Bitmap		mflakeImageTemp		= null;
    mflakeImageTemp = BitmapFactory.decodeResource(resources, R.drawable.snow_1);
    mflakeImage = Bitmap.createScaledBitmap(this.mflakeImageTemp, mflakeImageTemp.getWidth(),
    mflakeImageTemp.getHeight(), true);

    Log.d("cjp", "mflakeImageTemp=" + mflakeImageTemp);
    Log.d("cjp", "mflakeImage=" + mflakeImage);
    this.mflakeImageTemp.recycle();
    Log.d("cjp", "mflakeImage.isRecycled()=" + mflakeImage.isRecycled());

上面是一段简化后的代码,用于说明问题就行了:即从一张Bitmap,利用createScaledBitmap得到其另一张缩放的Bitmap,但是其实并没有缩放!

上段代码在Android4.0以下版本,mflakeImageTemp和mflakeImage是不同的两张图,但是在Android4.1上却是一张图。log如下:
4.0:
D/cjp     (21170): mflakeImageTemp=android.graphics.Bitmap@41cf0d28
D/cjp     (21170): mflakeImage=android.graphics.Bitmap@41cf32f0
D/cjp     (21170): mflakeImage.isRecycled()=false
4.1:
D/cjp     (11448): mflakeImageTemp=android.graphics.Bitmap@4179c850
D/cjp     (11448): mflakeImage=android.graphics.Bitmap@4179c850
D/cjp     (11448): mflakeImage.isRecycled()=true
所以,在4.1版本上,继续对已经回收的mflakeImage绘制雪花,就会导致异常退出


3. 为何有上述代码?
有人会问,既然没有任何缩放,为何先从一张图createScaledBitmap,然后把原图回收,这不等于绕了一圈回到原地?
没错。不过上述这份代码只是示意代码,原来的雪花效果,功能比较完善,封装比较好。它可以用一片雪花,通过设置Scale、Alpha、Rotate等参数设置,通过随机数,实现以假乱真的效果。
不过,由于我做这个的时候,设计师切了大小不同的图,就没必要进行缩放,所以我把Scale简单设置为1,而且我调试用的手机又是4.0的,所以这个问题就没有发现。


4.总结
Android SDK的每一次升级,都有一些变化(优化),当我们不清楚知道这些变化的时候,尽量审视下自己的代码,是不是会出现这种优化之后的问题。




                    

android各版本的差别

Android 1.0 第一版商用操作系统 Android1.1  更新了部分API,新增一些功能,修正了一些错误,同时增加com.google.android.maps包 A...
  • seriesgerry
  • seriesgerry
  • 2016年03月04日 15:07
  • 1673

Android各版本之间的差异

   Android 2.2   发行日期:2010.5.20 相对于上一个版本的改变: 1,  整体性能的大幅度提升 2,  3G网络共享功能 3,  Flash的支持 4...
  • smxueer
  • smxueer
  • 2016年08月20日 18:23
  • 3233

在android4.4中webview的使用相对于之前版本的一些区别

自Android4.4起,Android中的Webview开始基于Chromium(这大概是Android部门负责人更换的缘故)。这个改变使得webview对于html5,css,js有了更好的支持。...
  • liujibin1836591303
  • liujibin1836591303
  • 2015年07月15日 11:05
  • 1089

遇到一个gcc编译器版本导致的运行结果有差异的问题

正在进行的项目中有个网络模块,需要在上位机将数据包加密,然后在设备端将数据包解密。两者使用的加密方法是可逆的(大概是异或之类的)。在我测试时,发现设备上解出来的数据不正常,得不到上位机未加密前的数据。...
  • subfate
  • subfate
  • 2015年01月17日 14:38
  • 1246

android 创建bitmap的多种方式

–Bitmap代表这一张位图,BitmapDrawable里封装的图片就是一个Bitmap对象。如果要将Bitmap对象封装成BitmapDrawable对象只需要用构造方法即可。 //讲bitmap...
  • u014038534
  • u014038534
  • 2015年04月22日 16:56
  • 11785

JDK各版本之间的特性区别

jdk1.5的新特性: 1. 泛型    ArrayList list=new ArrayList()------>ArrayListlist=new ArrayList(); 2 自动装箱/拆...
  • qq_36074044
  • qq_36074044
  • 2017年04月07日 14:06
  • 583

RocketMQ与Kafka对比(18项差异)评价版

RocketMQ与Kafka对比(18项差异) 2015-02-28王启军奔跑中的蜗牛 此文是rocketmq作者vintage.wang所写,对于每项对比,后面都...
  • douliw
  • douliw
  • 2015年03月10日 18:42
  • 3088

Android中的Bitmap的高效加载介绍

如何高效的加载Bitmap呢?如果我们不注意这些,Bitmaps会迅速的消耗掉可用内存从而导致程序崩溃,出现下面的异常:java.lang.OutofMemoryError: bitmap size ...
  • Neacy_Zz
  • Neacy_Zz
  • 2016年02月15日 22:10
  • 836

Android开发Bitmap在Native层与Java层内存的两种生成方式

忽略掉遥远的Android2.2及之前版本,本文讨论基于Android4.4,也适用于4.x版本。          项目开发中遇到一个内存溢出问题,抓内存数据分析,发现有的bitmap在java层...
  • ITdashuiniu
  • ITdashuiniu
  • 2015年06月14日 12:58
  • 1987

Android各版本比较重要的更新

转载自:http://www.cnblogs.com/imlucky/archive/2011/10/21/2220596.html 命名规则   Android 用甜点作...
  • shw372029857
  • shw372029857
  • 2015年09月10日 21:53
  • 505
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android 不同版本下Bitmap创建差异
举报原因:
原因补充:

(最多只允许输入30个字)