1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > android bitmap 占用内存大小 drawable与bitmap内存占用大小

android bitmap 占用内存大小 drawable与bitmap内存占用大小

时间:2022-04-19 18:57:23

相关推荐

android bitmap 占用内存大小 drawable与bitmap内存占用大小

1, 比较Drawable与Bitmap占用内存大小

2, 比较BitmapFactory类的decodeResource方法与decodeStream方法的效率

好吧,先来看第1个测试!

以下这个是测试加载1000个Drawable对象的代码,很简单的,我就不解释了!

public class Main extends Activity

{

int number = 1000;

Drawable[] array;

@Override

public void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

array = new BitmapDrawable[number];

for(int i = 0; i < number; i++)

{

Log.e("", "测试第" + (i+1) + "张图片");

array[i] = getResources().getDrawable(R.drawable.img);

}

}

}

下面再来看一下加载1000个Bitmap对象的代码,同样的,代码很简单的,我就不解释了!

public class Main extends Activity

{

int number = 1000;

Bitmap bitmap[];

@Override

public void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

bitmap = new Bitmap[number];

for (int i = 0; i < number; i++)

{

Log.e("", "测试第" + (i+1) + "张图片");

bitmap[i] = BitmapFactory.decodeResource(getResources(), R.drawable.img);

}

}

}

看看上面的输出,才加载到第8张图片,程序就报错了“java.lang.OutOfMemoryError: bitmap size exceeds VM budget”。

通过上面的例子,可以看清楚地看出来,使用Drawable保存图片对象,占用更小的内存空间。

而使用Biamtp对象,则会占用很大内存空间,很容易就出现OOM了!

下面我们再来看一个例子,这个也是加载Bitmap对象。

只不过,之次不是使用BitmapFactory的decodeResource方法,

而是使用decodeStream方法,看代码。

public class Main extends Activity

{

int number = 1000;

Bitmap bitmap[];

@Override

public void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

bitmap = new Bitmap[number];

for (int i = 0; i < number; i++)

{

Log.e("", "测试第" + (i+1) + "张图片");

bitmap[i] =BitmapFactory.decodeStream(getResources().openRawResource(R.drawable.img));//这里换了方法

}

}

}

从上面可以看出,程序在加载到第566张的时候,就出现了OOM错误。

不过,跟第2个例子比起来,你会发现,程序可以加载更多的图片。

这说明了使用BitmapFactory的decodeResource方法会占据大量内存,

而使用使用decodeStream方法,则占据更小的内存。

从时间上来说,看看日志输出,大概估算了一下加载一张图片所需要的时间,发现,

decodeResource加载图片需要约0.17秒的时间,

而使用decodeStream方法,只需要约0.08秒的时间!

这说明了,decodeStream无论是时间上还是空间上,都比decodeResource方法更优秀!!

从上面三个例子,可以看出,用第一种方法(即用Drawable加载图片)可以加载更加的图片,加载32张图片的时间约为0.01秒!

我试着把Drawable的数量调至1000000,程序在运行时,停在了153761张图片里,手机提示,“应用程序无响应…”

个人猜测,Drawable应该不属于常驻内存的对象,不然的话,不可能不会出现OOM的~~

网上关于Drawable与Bitmap的资料太少,不能深入学习,真是遗憾~

刚才又做了个测试,把第一个例子中的

array[i] = getResources().getDrawable(R.drawable.img);

方法换成了

array[i] = Drawable.createFromStream(getResources().openRawResource(R.drawable.img), null);

结果和第三个例子一样,在第566张图片中,出现了OOM错误!

而且,加载的时间都是一样~~

这样一来,我就更加迷惑了~~

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。